c# - 捕获 block 选择

标签 c# exception

我正在阅读 C# 文章。它表明

在 catch block 的末尾,您有三个选择:

<我> • 重新抛出相同的异常,通知
的调用堆栈中更高层的代码 异常。

• 抛出不同的异常,为更高层的代码提供更丰富的异常信息 调用栈。

• 让线程从 catch block 的底部掉出来。

我无法理解这些要点。如果你能通过简单的例子来阐明它,那将是一个很大的帮助。

提前致谢。

更新: 当我需要处理重新抛出的异常时,我是否需要像

这样的嵌套 try .. catch block
try
{
   try
   {
   }
   catch(InvalidOperationException exp)
   {
     throw;
   }

}
 catch(Exception ex)
 {
    // handle the exception thrown by inner catch block
   // (in this case the "throw"   clause     inside the inner "catch")
 }
}

最佳答案

好吧,下面是代码中的那些不同选项:

选项 1:重新抛出

try
{
    // Something
}
catch (IOException e)
{
    // Do some logging first
    throw;
}

选项 2:抛出不同的异常

try
{
    // Something
}
catch (IOException e)
{
    // Do some logging first
    throw new SorryDaveICantDoThatException("Oops", e);
}

方案三:让线从底部掉出来

try
{
    // Something
}
catch (IOException e)
{
    // Possibly do some logging, and handle the problem.
    // No need to throw, I've handled it
}

编辑:要回答额外的问题,是的 - 如果您需要处理重新抛出的异常,则需要在外部范围内处理,正如问题中所示。但这很少是个好主意。事实上,catch block 本来就应该相对少见,嵌套 block 更是如此。

关于c# - 捕获 block 选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1530374/

相关文章:

c# - This.Task() 到 VB 出错,如何解决?

c# - 将选中的项目从选中列表框中添加或删除到列表框中

c# - 反序列化时从 json 字段名称中删除字符

android - 哪些情况抛出 SuperNotCalledException

java - 列数不匹配; SQL 语句 (org.h2.jdbc.JdbcSQLException) - 使用 NamedParameterJdbcTemplate 插入表时

c++ - 在现代 PC 的 C++ 异常类中避免 std::wstring 数据成员是否有意义?

c# - 在运行时设置通用类型

c# - CS1061 : 'IEnumerable<>' does not contain a definition for '' and no extension method '' accepting a first argument of type 'IEnumerable<>'

hibernate - 通过单列而不是复合主键连接

java - StackTraceElement 用于跟踪异常