c# - 捕获非类型的异常

标签 c#

捕获非以下类型的异常时是否有区别:

try
{
    ...
}
catch (TaskCanceledException)
{
    throw;
}
catch (Exception exception)
{
    ...
}

和:

try
{
    ...
}
catch (Exception exception) when (!(exception is TaskCanceledException))
{
    ...
}

最佳答案

是的,有。

在第二个代码块中,您将过滤一般异常类型。它不是要被过滤的,如果抛出“TaskCanceledException”会怎样?您没有处理它,它将升级为包含代码。您并不是真的要过滤“异常”类型的任何内容,因为它是所有其他类型异常的父级,并且是处理异常的最后一点。更好的选择是创建一个自定义异常并将它们放在单独的 catch block 中,并在需要时对其进行过滤。

与第二个选项相比,第一个选项更正确。尽管您不应该抛出任何异常并远离它们,除非它完全破坏交易。最重要的是,在抛出异常的 TaskCanceledException catch block 下面放置一个异常类型的 catch block 有什么意义?当使用异常类型的 catch 时,您基本上是在告诉“我想处理所有异常”,但同时您在异常情况下通过一个异常。抛出原始异常或处理它们。

希望这是有道理的。

关于c# - 捕获非类型的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55947708/

相关文章:

c# - 线程在 Asp.Net 中被中止 Web 服务

c# - HttpListener 服务器 header c#

c# - 在 C# 中获取整数的高字节和低字节并将其作为 char 数组发送到 com 端口,如何?

c# - 为什么我不能直接访问已分配给 WinForms Control.Tag 属性的自定义对象的属性?

c# - "Dynamically"在 NEST 中创建过滤器

c# - MVC 应用程序中缺少表单验证

c# - 如何在 C# 应用程序中获取外部窗口的名称?

c# - 尝试根据在 autofac 中运行时传递的泛型类型解析接口(interface)实现

c# - 如何有效地每秒执行50个并行方法500次?

c# - 使用 LINQ 连接字符串