c# - 将catch块中的2个语句合并为一个

时间:2009-12-15 16:08:14

标签: c# exception

有人知道是否可以将下面的catch块中的代码编写为单个语句?我无法想出办法,如果有的话,我只是好奇。

重要提示:必须保留堆栈跟踪。

    catch (Exception e)
    {
        if (e is MyCustomException)
        {
            // throw original exception
            throw;
        }

        // create custom exception
        MyCustomException e2 =
            new MyCustomException(
                "An error occurred performing the calculation.", e);
        throw e2;
    }

5 个答案:

答案 0 :(得分:15)

怎么样:

catch (MyCustomException)
{
   throw;
}
catch (Exception ex)
{
   throw new MyCustomException(ex);
}

答案 1 :(得分:2)

catch (Exception e)
{
   if (e is MyCustomException) throw;

   throw new MyCustomException("An error occurred performing the calculation.", e);
}

我认为这就像它的简洁一样,我认为。

这会立即抛出MyCustomException堆栈(这是您在问题中使用throw;完成的内容),同时抛出MyCustomException来包装遇到的其他Exception类型执行中。

或者,您可以这样做:

catch (Exception e)
{
   throw new MyCustomException("An error occurred performing the calculation.", e);
}

并且在MyCustomException被捕获的情况下,MyCustomException中的e.InnerException e MyCustomException System.Exception位于MyCustomException的下一级{堆栈或者在{{1}}不是被捕获的情况下,您将拥有{{1}}。

答案 2 :(得分:0)

我知道这并没有回答您的原始问题,但值得注意的是,在使用throw时应该小心 - 尽管里程比throw ex好,但仍有可能使用{ {1}}不保留堆栈跟踪。参见:

http://weblogs.asp.net/fmarguerie/archive/2008/01/02/rethrowing-exceptions-and-preserving-the-full-call-stack-trace.aspx

答案 3 :(得分:0)

实际上是可能的。

但是,堆栈跟踪将包含其他条目:

public static class ExceptionHelper
{
    public static void Wrap<TException>(Action action, Func<Exception, TException> exceptionCallback)
        where TException : Exception
    {
        try
        {
            action();
        }
        catch (TException)
        {
            throw;
        }
        catch (Exception ex)
        {
            throw exceptionCallback(ex);
        }
    }
}
//Usage:
ExceptionHelper.Wrap(() => this.Foo(), inner => new MyCustomException("Message", inner));

答案 4 :(得分:0)

这会有用吗?

        catch (Exception e)
        {
            throw e.GetType() == typeof(MyCustomException) ? e : new MyCustomException("An error occurred performing the calculation.", e);
        }