为什么抛出自己的例外是一个“坏主意”?

时间:2010-02-06 23:12:33

标签: exception custom-exceptions

为什么抛出自己的异常是一个“坏主意”?

found here

10 个答案:

答案 0 :(得分:24)

一般来说,抛出自己的异常是完全可以的。或许您要问的是“什么时候抛出我自己的例外不一定是个好主意?”

一种情况是您应该抛出标准异常。例如,如果您的方法采用文件名并且应该返回文件,那么您应该抛出平台的标准FileNotFoundException而不是抛出PeanutPowersFileNotFoundException。如果你真的想抛出自己的异常,你应该让它扩展标准的FileNotFoundException。

更新: Bloch在Effective Java

的第60项中解释了这一点

答案 1 :(得分:4)

不是。每当遇到异常情况时,您应该创建并抛出自定义异常。

答案 2 :(得分:3)

没有提供它们是从标准基本异常类型派生的(c ++中的std :: exception,或python中的异常等)

如果他们没有从正常的基础类型中获得,那么当他们期望捕获所有异常时,其他人可能无法捕获它们 - 这将是一件坏事。

答案 3 :(得分:3)

创建自己的异常类型并没有错。但是,在创建自己的框架之前,您应该检查您的框架是否已经提供了适合的异常。

来自.Net design guidelines

  

考虑抛出现有的异常   驻留在系统命名空间中   而不是创建自定义异常   类型。

     

创建并抛出自定义异常   如果你有错误的条件   可以通过编程方式处理   与现有的任何其他方式不同   例外。否则,扔一个   现有的例外情况。

     

不要创建并抛出新的异常   只是让你的团队例外。

答案 4 :(得分:2)

我相信你可能会问为什么重新抛出例外是个坏主意。

通过“重新抛出”,我的意思是捕获一个异常而不是生成一个新异常并抛出它。这可能会有问题,因为您最终可能会消耗原始堆栈跟踪并丢失错误的所有上下文。

答案 5 :(得分:2)

除非您想要添加到Exception类型中,否则不应该创建自己的Exception类型。

如果你想告诉你的API用户他们提供了一个无效的参数,你应该抛出一个ArgumentException,但如果你的库由于某些特定于库的原因而失败,那么你无法在常规异常中传达,你应该自己动手,让它包含开发人员需要的信息。

答案 6 :(得分:2)

如果您使用抛出异常来控制程序的业务逻辑,那么在抛出异常时,继续Peter的回应是另一种情况。

只要你抛出的异常来自一个适当的对象,并传达了这种特殊情况,抛出异常是完全可以接受的。

除了作为糟糕的设计模式之外,使用抛出异常来控制业务逻辑还具有性能影响 - 与基于方法返回的结果的分支相比,抛出和捕获异常相当昂贵

答案 7 :(得分:2)

创建自己的例外没有任何问题,可以对其进行定制,以准确传达适合您情况的信息。 ConfigFileNotFoundException传达的信息多于FileNotFoundException(我们找不到哪个文件?)。

但是,无论如何,请确保捕获并处理 代码中 内的每个自定义异常。当异常飞到模块外部的某个地方(称之为包,称之为命名空间)时,那些人甚至都不会知道它存在,更不用说它如何处理了。除了catch (Throwable t) {/* whut? */}

答案 8 :(得分:2)

对我来说,似乎问题是要抓住没有经验的候选人试图假冒经验。在我看来,抛出自己的例外并没有错,正如你可以看到在这里回答的其他人。

答案 9 :(得分:1)

这根本不是一个坏主意。如果出现异常情况,则应该抛出异常来处理它,特别是如果您正在设计其他人可能使用的代码,可能会收到错误的输入等等。

在不是绝对必要的情况下使用异常是一个坏主意,例如可以通过代码中的正常检查或作为正常执行的一部分来恢复的情况,因为它们确实具有与它们相关的大量开销。我想这就是你可能已经认识到他们一般都是个坏主意的地方。但是对于他们应该做的事情(标记你的代码无法处理的特殊情况),它们绝对是最好的工具。

如果您确实为其他人可能使用的代码创建自定义例外,请记录它们是什么以及它们的含义。这样,以后的代码用户就会知道它们是可能的以及它们出现时的含义,并且可以适当地处理它们。