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

本文关键字:异常 创建 | 更新日期: 2023-09-27 18:05:58

是否有一种比我在下面写的更好的方法来正确设置异常,就像抛出时一样?

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

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

简短的回答是:不。

系统。在抛出异常时填充异常属性:

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

所以如果你真的需要一个exception对象在它被抛出后的状态,你没有其他好的方法,只能抛出并捕获它。

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

如果你有一个以System.Exception作为输入参数的方法,并且你需要在其中使用StackTrace,考虑以下可能的解决方案:

  1. 使用可选的StackTrace输入参数重载方法。
  2. System的继承者。隐藏StackTrace属性的异常,该属性在对象创建时记住StackTrace,而不是抛出。
  3. 作为最后的手段,您可以为系统创建一个扩展方法。"填充"系统实例的异常类。例外:

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