提问人:user3844416 提问时间:10/27/2023 最后编辑:Petter Hesselberguser3844416 更新时间:10/27/2023 访问量:59
查找原始异常
Finding the original exception
问:
我有一个导入例程,可以将许多值导入到 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 函数。如何获取原始异常,以便获取日志记录的详细信息。
非常感谢!
答:
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 块中使用它,我想向其中添加更多信息。
上一个:使用 GNav 渲染库捕获的异常
下一个:总是尝试捕获外部资源调用?
评论