检查异常的优缺点是什么?[已关闭]

2022-09-04 23:44:02

您更喜欢像Java中那样的检查异常处理还是像C#那样的未检查的异常处理,为什么?


答案 1

我认为检查的异常是一个失败的实验。异常的最初目标是消除验证每个函数调用返回的需要,这导致程序难以阅读,并且可能效率低下,从而阻止程序员发出信号和处理异常。

虽然在纸面上很好,但在实践中,检查的异常重新引入了相同的问题,异常应该首先消除。它们在应用层之间添加了紧密耦合。它们使库无法在后续版本中更改其实现。crausher发布的链接详细介绍了这些问题,并比我更好地解释了问题。


答案 2

呵呵。

如果使用得当,检查异常是一件好事,但通常它们会导致以下情况:

doSomething();
try
{
  somethingThrowsCheckedException();
}
catch(ThatCheckedException)
{ }
doSomethingElse();    

坦率地说,这是错误的。你应该让你不处理的异常冒泡。

检查异常使用得当可能很好。但很多时候,正确执行检查异常的结果是这样的方法签名:

public void itMightThrow() throws Exception1, Exception2, Exception3, Exception4, // ...
Exception12, Exception13, /* ... */ Exception4499379874
{
  // body
}

我是在夸大其词吗?只是轻微的。

编辑:

也就是说,在异常处理方面,我更喜欢C#而不是Java的一件事与检查的异常无关(如果我使用Spec#,我无论如何都可以得到这一点)。不,我喜欢的是,C# 中的堆栈跟踪是在引发异常时填充的,而不是像在 Java 中那样实例化时填充的。

编辑 2:这是针对评论者@Yishai,@Eddie@Bill K:

首先,您应该查看此线程,以获取有关如何在不实例化异常的情况下获取堆栈跟踪的信息。请记住,在堆栈中行走是一个繁重的过程,不应定期进行。

其次,我喜欢在抛出而不是实例化时填充 C# 的异常堆栈跟踪的原因是,你可以执行如下操作:

private MyException NewException(string message)
{
   MyException e = new MyException(message);
   Logger.LogException(message, e);
   return e;
}

// and elsewhere...
if(mustThrow)
{
   throw NewException("WHOOOOPSIEE!");
}

这是一个在Java中无法做到的技巧,除非将方法包含在堆栈跟踪中。NewException