c# - 使用保护子句或捕获异常更好吗?

标签 c# java exception

<分区>

用保护子句防止异常好还是捕获异常好? 有最佳实践吗? 两种方法的优缺点?

例如这样更好:

try
{ 
    param=myArray[3];
}
catch (IndexOutOfRangeException e)
{
    do something...
}

或者这个:

if(myArray.Length < 4)
{
    do something...
}
else
{
    param=myArray[3];
}

谢谢大家的回答:)

最佳答案

is it better to prevent exception with a guard clause or catch the exception?

在像索引超出范围这样的“愚蠢”异常的情况下,总是前者。

在“外生”异常的情况下,总是后者。

Pro and cons of the two methodologies?

只有在愚蠢的异常(exception)情况下,后者才有缺点。它们是:

  • 与测试相比,异常非常昂贵
  • 异常旨在模拟异常罕见的控制流情况;如果可能访问超出范围的索引是正常的,那么不要编写异常处理程序。
  • 异常被报告为监听器的“第一次机会”异常即使异常被处理。许多系统——例如 ASP——监听第一次机会异常,记录所有异常,并将产生大量异常的组件视为错误,因为它们是 . (我曾经在 ASP 的公共(public)代码路径中引入了一个有意的第一次机会异常,一天后我就听说了。错误的子系统测试变得疯狂。)
  • 有一些异常我称之为“愚蠢的”异常——null 取消引用、索引超出范围等等——因为它们很容易避免并且表明故障非常危险,所以它们应该总是被视为 fatal error 并且从不处理(除非“处理程序”在关闭进程之前记录它们。)不要处理错误,消除错误

最后,您应该阅读我关于这个主题的文章。

http://ericlippert.com/2008/09/10/vexing-exceptions/

关于c# - 使用保护子句或捕获异常更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16484646/

相关文章:

c# - Cake MSBuild 设置属性

c# - 获取连接到 SignalR hub 的监听器、客户端的数量

java - UIManager setLookAndFeel 不起作用

Java 使用客户端套接字的多线程

c# - System.Timers.Timer Elapsed 库中的异常处理

c# - 缺少空的 Web 应用程序模板

c# - 如何使用 System.Spatial.GeographyPoint

java - 兴趣点 : How to validate empty cells in a range

c# - 在非 UI 线程上抛出异常时如何保留堆栈跟踪

java - Java中的Split方法返回空数组