获取Parse失败的实际值

Ath*_*oud 0 c# try-catch

免责声明这个问题是关于,If如何使用Parse方法异常,找出哪个参数/变量实际上没有转换.它是不是,争论这是否是最好的或者没有正确的方法找到替代品,如TryParse或后续If声明.但是,我们赞赏每一个替代方案或解决方法.

我在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
}
Run Code Online (Sandbox Code Playgroud)

int b1 = int.Parse(b);行将失败,catch块将捕获异常.

是否可以通过检查,以编程方式Exception查找string b导致错误的实际值(值的值,而不是变量的名称).例如,我希望得到类似的东西:

无法解析"b"

小智 6

改为使用TryParse(你不需要整个try catch),例如:

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
}
Run Code Online (Sandbox Code Playgroud)

  • @Athafoud:是的,其他答案可以证明有其他选择,但[例外情况应该是特殊情况](http://stackoverflow.com/questions/891217/how-expensive-are-exceptions-in-c).如果你正在解析一个字符串,那么我认为假设它可能不是一个整数是公平的.恕我直言,异常处理过度. (3认同)

Jon*_*eet 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以用它作为:

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}");
}
Run Code Online (Sandbox Code Playgroud)