重新引发C#中的异常

Rethrowing an exception in C#

本问题已经有最佳答案,请猛点这里访问。

我有一些代码可以捕获异常,回滚事务,然后重新引发异常。

1
2
3
4
catch ( Exception exSys )   {
    bqBusinessQuery.RollBackTransaction();
    throw exSys ;
}

如果我使用这个代码,vs代码分析会发出警告说

Use 'throw' without an argument instead, in order to preserve the stack location where the exception was initially raised.

如果我使用代码

1
2
3
4
catch ( Exception exSys )   {
    bqBusinessQuery.RollBackTransaction();
    throw;
}

然后我得到警告说

The variable 'exSys' is declared but never used

我该如何解决这个问题?

编辑我试过这个方法,但不管用。System.Exception类需要额外的消息以及内部异常。如果我这样做,它将抛出一条新消息,覆盖来自原始异常的消息。我不想得到新的异常,我想用相同的消息抛出相同的异常。

1
2
3
4
    catch (System.Exception ex)
    {
        throw new System.Exception(ex);
    }

编辑

1
2
3
4
        catch (System.Exception ex)
        {
            throw new System.Exception("Test",ex);
        }

尝试过这种方法。然后使用throw new Exception("From inside");手动引发异常。现在,例如,消息返回"test"而不是"from inside"。我想保持"从内部"的信息不变。建议的更改将导致错误显示代码出现问题。:


您不必将变量绑定到异常:

1
2
3
4
5
6
7
8
9
try
{
    ...
}
catch (Exception)
{
    bqBusinessQuery.RollBackTransaction();
    throw;
}

实际上,在您的情况下,当捕获任何异常时,您甚至不必命名异常类型:

1
2
3
4
5
6
7
8
9
try
{
    ...
}
catch
{
    bqBusinessQuery.RollBackTransaction();
    throw;
}

或者(如@zohar peled建议的那样)抛出一个新的异常,将捕获的异常用作内部异常。这样既可以保留堆栈,又可以为异常提供更多上下文。

1
2
3
4
5
6
7
8
try
{
    ...
}
catch (Exception e)
{
    throw new Exception("Transaction failed", e);
}

如果您确实想将异常用于某些处理(例如,记录它),但又想完整地重新执行它,请声明变量,但使用一个普通的throw

1
2
3
4
5
6
7
8
9
try
{
    ...
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
    throw;
}


1
2
3
4
5
catch (Exception)  
{
    bqBusinessQuery.RollBackTransaction();
    throw;
}

如果您不打算使用异常(例如,在某个地方传递消息),那么您就不需要将它拉出到变量中。你可以简单地捕捉,做定制的事情和投掷。