为什么将字符串转换为Int32在网站中随机失败
本文关键字:网站 随机 失败 Int32 字符串 转换 为什么 | 更新日期: 2023-09-27 18:08:52
我有一些代码,有时由于错误System.FormatException
而失败。在我的理解中,如果UserId
不是空的,那么默认的0
应该从下面的方法GetUserProperty
返回,我知道(并且毫不怀疑)系统中的UserId
将是一些数字或空的,它永远不会是非数字的任何东西。
代码如下:
private void SomeMethod()
{
var userId = Convert.ToInt32(GetUserProperty("UserId", "0"));
// Do something with userId..
}
public string GetUserProperty(string propertyName, string defaultValue = "")
{
var propertyValue = SecurityUtil.GetUserProperty(propertyName);
return !string.IsNullOrWhiteSpace(propertyValue) ? propertyValue : defaultValue;
}
StackTrace在系统日志中显示:
System.FormatException: Input string was not in a correct format. at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) at ...
可能SecurityUtil.GetUserProperty(propertyName)
返回的值不能解析为int类型。
修改SomeMethod()
private void SomeMethod()
{
int userId = 0;
string userProperty = GetUserProperty("UserId", "0");
if(int.TryParse(userProperty , out userId)){
// Do something with userId..
}
else{
//Do something with the exception
//Console.Write("Invalid property value {0}", userProperty);
//Sitecore.Diagnostics.Log.Info("Invalid property value " + userProperty.ToString(), this);
}
}
欢迎来到一个字母表不同的世界。
CurrentCulture
可能是您的UI文化,因此不可靠。可能是外汇。中文取决于你的用户:-)
更好的处理方法是显式设置区域性。
int value;
if (!int.TryParse(GetUserProperty("UserId", "0"),
NumberStyles.Any, CultureInfo.InvariantCulture, out value))
{
// make / throw your own error message with details on the user property!
}
试着这样改变你的方法:
public string GetUserProperty(string propertyName, string defaultValue = "")
{
var propertyValue = SecurityUtil.GetUserProperty(propertyName);
return Array.TrueForAll(propertyValue .ToCharArray(), c => Char.IsDigit(c)) ? propertyValue : defaultValue;
}
很可能是getuserproperty返回一个无效整数。试试这个(如果您的值可以是23.5,请使用Regex来验证字符串):
private void SomeMethod()
{
var userIdStr =GetUserProperty("UserId", "0");
Debug.Assert(userIdStr.All(char.IsDigit));
var userId = Convert.ToInt32(userIdStr);
// Do something with userId..
}
或者使用Int.TryParse设置一个带有条件的断点
错误原因是SecurityUtil.GetUserProperty()
方法,因为它可能无法转换为Convert.ToInt32()
。
public string GetUserProperty(string propertyName, string defaultValue = "")
{
var propertyValue = SecurityUtil.GetUserProperty(propertyName); // Why used var maybe because its not convertible to integer?
return !string.IsNullOrWhiteSpace(propertyValue) ? propertyValue : defaultValue; // If this is true and propertyValue is not convertible to Int32, System.FormateException will be occurred.
}
就像在我的小提琴的例子:http://goo.gl/GMP5tH