创建c#异常而不是抛出它

时间:2016-09-07 12:40:46

标签: c# exception-handling

有没有比我下面写的更好的方法来获得正确设置的异常,就像被抛出一样?

try {
throw new Exception("Blah");
}
catch (Exception exe) {
Assert.NotNull(exe.StackTrace);
DoSomeWork(exe);
// throw;
}

1 个答案:

答案 0 :(得分:2)

简短的回答是:NO。

System.Exception属性填入when it is thrown

  

默认情况下,在抛出异常对象之前立即捕获堆栈跟踪。当没有抛出异常时,使用Environment.StackTrace获取堆栈跟踪信息。

所以,如果你真的需要一个状态的exception对象,那么它在被抛出之后就没有别的好办法了,只能投掷并抓住它。

仍然不要放弃主要问题:你真的需要异常对象吗?

如果您的方法有System.Exception作为输入参数,并且您需要内置StackTrace,请考虑以下可能的解决方案:

  1. 使用可选的StackTrace输入参数重载方法。
  2. System.Exception的后继,具有隐藏的StackTrace属性,该属性在未创建对象时记忆StackTrace。
  3. 作为最后的手段,您可以为System.Exception类创建一个扩展方法,其中包含"填充" System.Exception的一个实例:

    private void MyCode()
    {
        Exception exe = new Exception("Blah");
        exe.Populate();
        DoSomeWork(exe);
    }
    
    
    public static void Populate(this System.Exception source)
    {
        try
        {
            throw source;
        }
        catch
        {
        }
    }