2016-09-07 52 views
0

有没有比我在下面写的更好的方式来获得像引发时那样正确设置的异常?创建c#异常而不是抛出它

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

'VAR myExceptionIDontWantToThrow =新的异常(“嗒嗒“);' – Phylogenesis

+1

”更好“是什么意思? “什么时候抛出正确设置”是什么意思?你最终的目标是什么? – CodeCaster

+1

正确设置是什么意思?你的预期产出是多少? – solarc

回答

1

简短的回答是:没有。

的System.Exception的属性填充在when it is thrown

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

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

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

如果你有有System.Exception作为输入参数的方法,你需要一个堆栈跟踪内,认为这些可能的解决方案:

  1. 使用可选的堆栈跟踪输入参数的方法重载。
  2. 具有隐藏StackTrace属性的System.Exception的后继者,该属性在不抛出创建对象时存储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 
        { 
        } 
    }