C#异常捕获使用try..catch块

Zeo*_*os6 3 c# exception-handling block try-catch

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

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

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

问题2:我是否需要明确地捕获所有异常,或者仅使用最大的generaL异常捕获所有其他异常?例如,仍然使用Path类,我需要做...

try { ... }
catch(System.ArgumentNullException ane) { ... }
catch(System.NotSupportedException nse) { ... }
catch(System.IO.PathTooLongException ple) { ... }
catch(System.IO.SecurityException se) { ... }
catch(System.ArgumentException ae) { ... }
Run Code Online (Sandbox Code Playgroud)

或者简单......

catch(System.ArgumentException ae) { ... }
Run Code Online (Sandbox Code Playgroud)

赶上所有例外?

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

try
{
  ... ;
  return true;
}
catch(System.ArgumentException ae)
{
  ... ;
  return false;
}
Run Code Online (Sandbox Code Playgroud)

Ode*_*ded 6

问题1:

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

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

问题2:

抓住可以做某些事情的例外是一种很好的做法.如果你无法合理地做任何事情,那就让它冒泡吧.

通常,tt最好先捕获更具体的异常.

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

catch(System.ArgumentException ae) { ... }
Run Code Online (Sandbox Code Playgroud)

不会抓住System.IO.SecurityException因为System.IO.SecurityException不继承System.ArgumentException.

问题3:

是的,这是有效的语法.

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