使用 try..catch block 的 C# 异常捕获

标签 c# exception try-catch block

我是 C# 的新手,想更好地理解异常捕获。这些问题可能是愚蠢的菜鸟问题。它们对我很重要,我提前道歉。

例如,在System.IO Path 类GetFullPath 中,可以抛出五个异常:ArgumentException、SecurityException、ArgumentNullException、NotSupportedException 和PathTooLongException。我知道必须组织 catch block ,以便首先捕获最具体的异常,最后捕获最一般的异常。

问题一: 当 MSDN 提供有关类可能抛出的异常的信息时,我如何知道哪个异常最具体,哪个最不具体?换句话说,我如何从 MSDN 给我的内容中确定从最具体到最不具体的异常顺序?

问题二: 我是否需要明确地明确捕获所有异常,或者只使用最一般的异常来捕获所有其他异常?比如还在使用Path类,需要做...

try { ... }
catch(System.ArgumentNullException ane) { ... }
catch(System.NotSupportedException nse) { ... }
catch(System.IO.PathTooLongException ple) { ... }
catch(System.IO.SecurityException se) { ... }
catch(System.ArgumentException ae) { ... }

或者将一个简单的...

catch(System.ArgumentException ae) { ... }

捕获所有异常?

问题 3: 在 bool 方法中执行以下操作是否正确的语法结构 ...

try
{
  ... ;
  return true;
}
catch(System.ArgumentException ae)
{
  ... ;
  return false;
}

最佳答案

问题 1:

在每个异常的 MSDN 文档中,您可以看到它的继承链。这会告诉您哪些更具体(链越低,它们越具体)。

您还可以在 Visual Studio 对象浏览器中查看此信息。

问题 2:

捕获您可以采取措施的异常是一种很好的做法。如果您不能合理地对异常做任何事情,那就让它冒泡吧。

一般情况下,tt 最好先捕获更具体的异常。

您还需要查看不同的继承链并决定要捕获哪些异常。例如,只是做:

catch(System.ArgumentException ae) { ... }

不会捕捉到 System.IO.SecurityException作为System.IO.SecurityException不继承自 System.ArgumentException .

问题 3:

是的,这是有效的语法。

虽然我不会说好的做法。如果这是异常情况,最好让异常冒出来。建议的设计将导致异常被忽略,并且针对此方法进行编程的任何人都需要检查返回值(他们可能会忘记)。

关于使用 try..catch block 的 C# 异常捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6708687/

相关文章:

c# - 为什么 LZMA SDK (7-zip) 这么慢

c# - 对象引用未设置为具有 XDocument 的对象的实例

exception - 有没有办法在 Python 3.x 中获取可能的异常列表?

java - 是否有一个标准的 java 异常类表示 "The object was not found"?

python - 如何捕获 ctrl-c 以杀死 Flask python 脚本

c# - 使用C#应用下载youtube文件会产生UnauthorizedAccessException

C# if/return 或 if/return/else 更好?

java - JVM 什么时候开始省略堆栈跟踪?

php - 为什么此查询不产生 mysql_error() 结果?

Java:如何重构这种try-catch block ?