免责声明这个问题是关于,如果和如何我们可以使用
Parse
方法例外,找到哪个参数/变量实际上没有转换。如果这是最好的或正确的方法,既不能找到TryParse
或后续If
语句之类的替代方案,那么 NOT 也是如此。但是,我们赞赏每一个替代方案或解决方法。
我在C#中有以下代码块
string a = "1"
string b = "b"
string c = "3"
// add many more similar
try
{
int a1 = int.Parse(a);
int b1 = int.Parse(b);
int c1 = int.Parse(c);
}
catch (Exception e)
{
// Here I will do some logging
}
此处int b1 = int.Parse(b);
行将失败,catch块将捕获异常。
是否可以通过编程方式检查Exception
信息,以查找导致错误的实际值(string b
的值,而不是变量的名称)。例如,我希望得到类似的东西:
无法解析“b”
答案 0 :(得分:6)
使用TryParse(您不需要整体尝试捕获),例如:
int a1=0;
if(!int.TryParse(a, out a1))
{
//do something here
}
int b1=0;
if(!int.TryParse(b, out b1))
{
//do something here
}
int c1=0;
if(!int.TryParse(c, out c1))
{
//do something here
}
答案 1 :(得分:5)
不可靠 - FormatException
中没有任何内容可以帮助您。解析消息非常脆弱 - 它可以在不同版本的.NET中更改,并且它将被本地化。
一种选择是编写自己的Parse
方法,该方法可与int.Parse
互操作,但会抛出FormatException
的子类。例如:
public class ParseException : FormatException
{
public string OriginalValue { get; }
public ParseException(string message, string originalValue)
: base(message)
{
OriginalValue = originalValue;
}
}
public class ExtendedParsing
{
public int ParseInt32(string value)
{
int result;
if (int.TryParse(value, out result))
{
return result;
}
throw new ParseException($"Unable to parse \"{value}\"", value);
}
}
然后您可以将其用作:
try
{
int a1 = ExtendedParsing.ParseInt32(a);
int b1 = ExtendedParsing.ParseInt32(b);
int c1 = ExtendedParsing.ParseInt32(c);
}
catch (ParseException e)
{
Console.WriteLine($"Value that I failed to parse: {e.OriginalValue}");
}
答案 2 :(得分:0)
这个简单的模式怎么样
string a = "1";
string b = "b";
string c = "3";
int aInt, bInt, cInt;
if (!int.TryParse(a, out aInt))
{
//report e.g.
Console.WriteLine($"Could not parse {nameof(a)}");
}
if (!int.TryParse(b, out bInt))
{
//report e.g.
Console.WriteLine($"Could not parse {nameof(b)}");
}
if (!int.TryParse(c, out cInt))
{
//report e.g.
Console.WriteLine($"Could not parse {nameof(c)}");
}
答案 3 :(得分:0)
我们正在使用这种模式(主要是为了避免本地化消息和中性记录器消息的切换/案例,为简单起见,此处未显示,否则@JonSkeet的解决方案创建自定义异常和调用包装器方法是正确的方法):
TryParse
我们的想法是在做某事之前设定理由(可选择在之后清除它),如果失败则执行此操作 - 向用户显示原因。
Something 可以是任何一段代码,因此我并不是通过建议{{1}}来专门改进解析。