技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营

赞助商

分类目录

赞助商

最新文章

搜索

[C#技巧]C#重新抛出异常的正确方法,注意不是throw e!

作者:admin    时间:2023-5-6 10:58:17    浏览:

异常处理是我们代码的一个非常重要的方面。我们经常可以看到在代码库中重复的一种模式是捕获异常,在本地处理它,然后将其重新抛给更高级别的组件。

重新抛出步骤是我们很容易犯错误的地方:

try
{
    await GetBlogsFromApi();
}
catch (HttpRequestException e)
{
    throw e;
}

你知道当我们重新抛出这样的异常时会出现什么问题吗?

throw e;语句中,表达式的结果e必须可隐式转换为System.Exception

你可以使用内置异常类,例如ArgumentOutOfRangeExceptionInvalidOperationException。.NET 还提供了在特定条件下抛出异常的辅助方法:ArgumentNullException.ThrowIfNullArgumentException.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 将终止正在执行的线程。

相关文章

标签: asp.net  CSharp  抛出异常  throw  代码性能  优化  
x
  • 站长推荐
/* 左侧显示文章内容目录 */