有人知道是否可以将下面的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;
}
答案 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}}不保留堆栈跟踪。参见:
答案 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);
}