C# 如何在FormatException中一般记录受影响的字符串?

C# 如何在FormatException中一般记录受影响的字符串?,c#,.net,logging,exception-handling,C#,.net,Logging,Exception Handling,我有一个解析函数,其中,字符串被转换为日期时间对象。大多数情况下,这是可行的,但有时输入字符串可能采用不同的日期格式,或者其中包含一些附加字符串,然后转换失败。 要处理这些情况,我需要知道哪些字符串导致了问题。异常消息不会告诉我: System.FormatException:字符串未被识别为有效的日期时间。有一个从索引0开始的未知单词 即使转换为FormatException,异常对象也不会提供有问题的输入字符串: DateTime MyDateTime; try{ MyDateTim

我有一个解析函数,其中,
字符串
被转换为
日期时间
对象。大多数情况下,这是可行的,但有时输入字符串可能采用不同的日期格式,或者其中包含一些附加字符串,然后转换失败。
要处理这些情况,我需要知道哪些字符串导致了问题。异常消息不会告诉我:

System.FormatException:字符串未被识别为有效的日期时间。有一个从索引0开始的未知单词

即使转换为
FormatException
,异常对象也不会提供有问题的输入字符串:

DateTime MyDateTime;
try{
    MyDateTime = DateTime.Parse(datestring, MyCultureInfo).Date;
    //many other lines
}catch(Exception e){
    Log(e);
}
我需要做什么才能得到这样的日志

System.FormatException:字符串未被识别为有效的日期时间。有一个从索引0开始的未知单词。
输入:“2019.02.20”

当然,我可以用一个try-catch块包含代码中的每一行

try{
    MyDateTime = DateTime.Parse(datestring, MyCultureInfo).Date;
    //many other lines
}catch(FormatException e){
    Log(e);
}
但那太糟糕了

但那太糟糕了

是的。当您开始正确处理和记录错误时,您的代码大小会增加

大多数日志框架都有一个
Log
方法,它接受一个异常和一条附加消息。在这种情况下,您可能可以编写如下内容:

DateTime MyDateTime;
try{
    MyDateTime = DateTime.Parse(datestring, MyCultureInfo).Date;
}catch(Exception e){
    Log(e);
    Log($"Input: '{datestring}'");
}
try{
  //many other lines
}catch(Exception e){
    Log(e);
}
Log(e, $"Unable to parse DateTime {datestring}");
当然,您可以围绕
DateTime.Parse
创建一个包装器方法,它抛出自己的异常。比如:

DateTime MyDateTime;
try{
    MyDateTime = DateTime.Parse(datestring, MyCultureInfo).Date;
}catch(Exception e){
    Log(e);
    Log($"Input: '{datestring}'");
}
try{
  //many other lines
}catch(Exception e){
    Log(e);
}
Log(e, $"Unable to parse DateTime {datestring}");

是的,你将不得不满足每一个地方,它将无法使你包括字符串。尽管我会避免使用异常编码,并假设它会失败。例如

private static DateTime ParseDate(string input)
{
    try
    {
        return DateTime.Parse(input, MyCultureInfo).Date;
    }
    catch (FormatException e)
    {
        throw new FormatException($"Unable to parse DateTime '{input}': {e.Message}", e);
    }
}

在try语句之前声明变量datestring:String datestring=“”;我想我喜欢抛出我自己的异常的想法。解析函数实际上是在一个被许多程序使用的库中实现的,所以它不会有太多开销。谢谢你的提示,我没想到。