[C#技巧]C#重新抛出异常的正确方法,注意不是throw e!
作者:admin 时间:2023-5-6 10:58:17 浏览:异常处理是我们代码的一个非常重要的方面。我们经常可以看到在代码库中重复的一种模式是捕获异常,在本地处理它,然后将其重新抛给更高级别的组件。
重新抛出步骤是我们很容易犯错误的地方:
try
{
await GetBlogsFromApi();
}
catch (HttpRequestException e)
{
throw e;
}
你知道当我们重新抛出这样的异常时会出现什么问题吗?
在throw e;
语句中,表达式的结果e
必须可隐式转换为System.Exception
。
你可以使用内置异常类,例如ArgumentOutOfRangeException
或InvalidOperationException
。.NET 还提供了在特定条件下抛出异常的辅助方法:ArgumentNullException.ThrowIfNull
和ArgumentException.ThrowIfNullOrEmpty
。你还可以定义自己的派生自System.Exception
的异常类。
异常的堆栈跟踪被重写到我们明确重新抛出它的代码行,这意味着我们首先丢失了有关导致异常的原因的所有有价值的信息,这会使调试代码变得非常困难。
但是,我们可以很容易地解决这个问题。
在catch
块内,你可以使用throw;
语句重新抛出块处理的异常catch
:
try
{
await GetBlogsFromApi();
}
catch (HttpRequestException e)
{
throw;
}
当我们这样做时,异常会在保留原始堆栈跟踪的同时重新抛出,我们现在首先保存有关导致异常的原因的所有有价值的信息,我们调试代码并找出问题所在会容易得多。
注意throw;
保留异常的原始堆栈跟踪,它存储在Exception.StackTrace
属性中,与此相反,throw e;
更新 的StackTrace属性e
。
抛出异常时,公共语言运行库 (CLR) 会查找可以处理此异常的catch
块。如果当前执行的方法不包含这样的catch
块,CLR 会查看调用当前方法的方法,依此类推调用堆栈。如果没有catch
找到块,CLR 将终止正在执行的线程。
相关文章
- 站长推荐