修改异常并抛出它

时间:2014-02-27 23:30:50

标签: c# exception elmah.mvc

我想修改Message中的Exception属性以及其他信息。例如,SQL生成的EF

但我不想失去原来Exception的任何内容。这会让我失去stacktrace

catch (Exception ex)
{
    throw ex;
}

这些Exception来自数据层。我想throw他们,以便他们可以使用Elmah进行记录。

我有什么选择?

5 个答案:

答案 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;
}

这会在不重新抛出异常的情况下进一步传递异常,并保留上下文。