我想修改Message
中的Exception
属性以及其他信息。例如,SQL
生成的EF
。
但我不想失去原来Exception
的任何内容。这会让我失去stacktrace
:
catch (Exception ex)
{
throw ex;
}
这些Exception
来自数据层。我想throw
他们,以便他们可以使用Elmah
进行记录。
我有什么选择?
答案 0 :(得分:3)
定义自定义异常类,并将原始异常作为内部异常,并抛出包装的异常:
public class CustomException : Exception
{
public CustomException()
: base()
{
}
public CustomException(string message)
: base(message)
{
}
public CustomException(string message, Exception innerException)
: base(message, innerException)
{
}
//...other constructors with parametrized messages for localization if needed
}
catch (Exception ex)
{
throw new CustomException("Something went wrong", ex);
}
当然应该相应更改其名称。这样您就可以完全控制域中使用的异常,并且不会丢失原始投掷中的任何信息。
特别是在大型项目中,使用具有良好类名的自定义异常非常有用。它们有助于在许多简单情况下从一见钟情来诊断问题,而无需读取异常细节和调试。只有在出现一些非常复杂的问题时才需要后者。因此,抛弃缠绕在彼此周围的Exception
个实例似乎是一种不好的做法。
答案 1 :(得分:2)
如果你想添加一些东西,你可以将它包装在另一个例外中:
catch( Exception ex)
{
throw new Exception("my new message",ex);
}
您将能够使用完整堆栈跟踪访问内部异常
答案 2 :(得分:1)
对你的问题的简短回答是,你做不到。例外情况实际上是故障报告,因此表示历史事件。天生的历史事件是不可变的,因此你不能(也不应该)“修改”它们。
相反,你可以做的是通过捕获它并抛出 new 异常来为异常添加一些上下文。这将允许您附加其他诊断信息,并传递原始异常,从而维护整个故障跟踪。
我不会详细介绍如何编写自定义/使用异常,因为我之前已就此主题撰写过detailed answer。但是,作为示例,您的处理代码最终应该看起来像
catch (SomeEntityFrameworkException ex)
{
throw new MyCustomException("Some additional info", ex);
}
答案 3 :(得分:0)
我只是创建自己的异常,其中包含原始异常和您想要的任何其他信息,在catch块中创建新异常并抛出它
答案 4 :(得分:-1)
只是做:
catch (Exception ex)
{
throw;
}
这会在不重新抛出异常的情况下进一步传递异常,并保留上下文。