我是 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/