在 C# 中重新抛出异常

Rethrowing an exception in C#

我有一些代码可以捕获异常、回滚事务然后重新抛出异常。

catch ( Exception exSys )   {
    bqBusinessQuery.RollBackTransaction();
    throw exSys ;
}

如果我使用这段代码,VS Code 分析会抛出警告

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

如果我用代码

catch ( Exception exSys )   {
    bqBusinessQuery.RollBackTransaction();
    throw;
}

然后我收到一条警告说

The variable 'exSys' is declared but never used

我该如何解决这个问题?

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

    catch (System.Exception ex)
    {
        throw new System.Exception(ex);
    }

编辑

        catch (System.Exception ex)
        {
            throw new System.Exception("Test",ex);
        }

试过这个方法。然后使用 throw new Exception("From inside"); 手动引发异常。现在,ex.Message returns "Test" 而不是 "From inside"。我想按原样保留 "From inside" 消息。这个建议的更改将导致到处都是错误显示代码的问题。 :/

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

try
{
    ...
}
catch (Exception) 
{
    bqBusinessQuery.RollBackTransaction();
    throw;
}

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

try
{
    ...
}
catch
{
    bqBusinessQuery.RollBackTransaction();
    throw;
}

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

try
{
    ...
}
catch (Exception e)
{
    throw new Exception("Transaction failed", e);
}

如果您确实想将异常用于某些处理(例如记录它),但又想原封不动地重新抛出它,请声明变量,但使用普通 throw:

try
{
    ...
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
    throw;
}
catch (Exception)   
{
    bqBusinessQuery.RollBackTransaction();
    throw;
}

如果您不打算使用异常(例如,将消息传递到某处),则无需将其提取到变量中。你可以简单地抓住,做自定义的事情然后扔。