获取Parse失败的实际值

时间:2016-12-07 13:29:09

标签: c# try-catch

  

免责声明这个问题是关于,如果如何我们可以使用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”

4 个答案:

答案 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}}来专门改进解析。