查找原始异常

Finding the original exception

提问人:user3844416 提问时间:10/27/2023 最后编辑:Petter Hesselberguser3844416 更新时间:10/27/2023 访问量:59

问:

我有一个导入例程,可以将许多值导入到 Object 的属性中。对象属性中有很多值,它们可以按任何顺序排列,因此我使用反射来查找属性,然后设置其值。这一切都运行良好,除非 Objects 属性 setter 方法引发异常,否则我看不到它。

代码摘录:

try
{
    PropertyInfo piInstance = MBtype.GetProperty(columnlist[intColumn]);
    piInstance.SetValue(newMailbox, CurrentRow[intColumn]);
}
catch (Exception ex)
{
    HelpFunc.writeToLog($"Error: '{ex.Message}'", "Error");
}

初始错误代码的属性为:

throw new ArgumentException($"{value} must be valid email address", value);

但是,当我查看日志时,它没有告诉我参数异常,它告诉我错误是:

“错误:'调用的目标引发了异常。'

即原始异常丢失。setValue 是一个 Net 函数。如何获取原始异常,以便获取日志记录的详细信息。

非常感谢!

C# 异常 属性

评论


答:

1赞 SomeBody 10/27/2023 #1

您必须检查内部异常:

try
{
  PropertyInfo piInstance = MBtype.GetProperty(columnlist[intColumn]);
  piInstance.SetValue(newMailbox, CurrentRow[intColumn]);
}
catch (Exception ex)
{
   HelpFunc.writeToLog($"Error: '{ex.Message}', Inner Exception: '{ex.InnerException?.Message}'", "Error");
}

我建议始终记录异常的方法,因为这样你就有了所有信息(包括堆栈跟踪和内部异常)。ToString()

在线演示:https://dotnetfiddle.net/L1msAC

评论

0赞 Tim Schmelter 10/27/2023
您可以收集所有 InnerExceptions: stackoverflow.com/a/9314368/284240 例如:string.Join("; ", ex.GetInnerExceptions().Select(ex => ex.Message))
1赞 m4rs___ 10/27/2023 #2

另一个答案是完全有效的,但是您可以更彻底地使用它;如果您试图在大型代码库中找到异常的确切来源,这可能会很好,因此 StackTrace 属性可能是一种祝福。这是我使用的:

public void depositLog(Exception exception, string user, string path) 
{
    using (StreamWriter w = File.AppendText(path))
    {
        var st = new StackTrace(exception, true);

        var sourceFrame = Enumerable.Range(0, st.FrameCount).FirstOrDefault(i => st.GetFrame(i).GetFileLineNumber() > 0);
        w.WriteLine(version + user + "~~~~~  Encountered exception:   " + exception.ToString() + "STACKTRACE:  " + st.ToString() + sourceFrame.ToString());
    }
}

我在以下位置分配了这个方法:Main()

AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{
    lt.depositLog(eventArgs.Exception, "CATCHALLEXCEPTIONREPORTER for " + user, logPath);
};                   

因此,每个异常都会写入我的日志文件中,并且我还在 try/catch 块中使用它,我想向其中添加更多信息。