当前位置: 首页 > 知识库问答 >
问题:

将选中的异常设置为RuntimeException

田普松
2023-03-14

我正在开发一个遗留系统,它有一个自定义的异常,到处都使用gosh frickity。它受到了ServletException类的启发,该类表示“好的,每当您的Servlet中出现异常时,您都会希望抛出此ServletException”。

随着系统的发展(超过10年),一个在更高级别捕获异常的更强大的系统已经出现,不再需要将每个异常都包装在这个自定义异常中。(有人可能会说从来没有,但那是另一回事。这是一个稳定的应用程序,所以我不会抱怨太多!!)但我们不会一次重构它们,只是随着时间的推移慢慢重构。

然而,有一件事会让事情变得更简单,那就是如果自定义异常是运行时异常而不是检查异常。这样,我们就不需要在任何地方显式地捕获它,并且尚未重构的遗留代码将继续抛出它,就像如果发生空指针异常一样。

我的问题是...接受一次检查的异常并使其成为运行时异常的副作用是什么?

除了对不必要的检查和抛出声明的警告之外,我想不出还有什么,但如果能从以前走过这条路的人那里得到意见,那就太好了。

共有3个答案

景志
2023-03-14

这里有几个我能想到的

  • 运行时异常可能会转移到您不打算转移的层。
    • 示例:Servlet---
    • 如果序列图看起来像A类--

    在我看来,作为一般的拇指法则:

    • 当您“期望”异常作为正常控制流的一部分并知道如何处理时,请使用检查异常。例如:业务规则的验证说帐户余额必须比借方金额至少大100。
    • 使用未经检查的异常时,你不期望异常作为正常控制流的一部分,因此没有办法处理它,但你知道你的层中的某个类会处理它,以确保优雅的降级。
    • 永远不要使用错误。只有JRE有理由抛出错误。

楚羽
2023-03-14

类似的事情发生在我必须维护的应用程序的旧模块上。将异常转换为运行时的唯一问题是您可能会丢失颗粒度,但这完全取决于您来处理。

例如,我们在深层有大量这样的代码

catch(IOException e){    
    Throwables.propagate(e);
}

我们在该层上粗心地使用了这种模式,当我们需要检查异常原因时,我们总是必须得到异常原因,这在更高层中制造了很多样板文件。直到今天,我认为最好创建一个良好的未检查异常的类层次结构,以保持颗粒度。

catch(IOException e){
    throw new FileNotCreatedException(e);
}

有了这个,您可以在其他层中轻松捕获异常并轻松划分错误和回退:

catch(FileNotCreatedException e){
   notifyError(e);
} catch(NoMoreStorageException e){
   releaseSomeStorage();
   retryOperation();
}
拓拔嘉颖
2023-03-14

将已检查的异常更改为未检查的异常对现有的工作代码几乎没有实际影响,但您确实需要注意在代码中的某个地方捕获(RuntimeException…)的可能性 。这样的捕获现在不会截获您的自定义异常,但如果您将其取消选中,则会截获。

如果您做了任何与抛出该异常的方法(显然是其中的大多数)相关的反思,您也可能会遇到问题。

 类似资料:
  • 问题内容: 为什么Java中的两种异常类型分别称为“已检查”和“未检查”?这些名字背后的原因是什么? 问题答案: 如果您调用一个声明为抛出 检查 异常的方法(例如),则编译器将 检查 您是否正在捕获该异常或声明您将其重新抛出。同样,为了首先抛出这种检查过的异常,编译器会 检查 您是否已将其声明为方法签名的一部分。 基本上,它与类型检查有点像,只是在方法可以引发异常方面。 编译器不会对未检查的异常执

  • 问题内容: 我有一个带有多个选择框的页面,如下所示: 这些是在Django中自动生成的,因此无法将CSS类,ID或属性直接应用于选项。选择元素的ID为’item-0-status’,’item-1-status’,’item-2-status’等。 我通过以下JQuery代码为选项分配颜色: 哪个工作正常。 我还希望select元素具有与selected选项相同的背景色,我正在尝试使用以下方法实现

  • 问题内容: 在numpy中我有一个数组 将超低值设置为零的最快,最简单的方法是什么 效率不是最重要的。 问题答案: 嗯 我对此并不满意,但这似乎可行: 您可以根据自己的问题选择容忍度。我通常使用一个数量级以上 但这取决于问题。

  • 问题内容: 我可以看到捕获了一个可以打印的异常,尽管这种异常一直存在。 我是否需要将其设置在某个地方,或者缺少将原因设置为null的东西? 问题答案: 一个例外的属性和。该消息是一种描述,或多或少准确地告诉人类读者出了什么问题。的是不同的东西:它是,如果有的话,另一个(嵌套)。 如果我们使用这样的自定义异常,通常会使用该概念: 编辑-响应@djangofans评论。 标准是嵌套表达式(原因)也将与

  • 问题内容: 是否有可能使Eclipse忽略错误“未处理的异常类型”? 在我的特定情况下,原因是我已经检查了文件是否存在。因此,我认为没有理由放入try catch语句。 还是我错过了什么? 问题答案: 是否有可能使Eclipse忽略错误“未处理的异常类型FileNotFoundException”。 否。那将是无效的Java,并且Eclipse不允许您更改语言规则。(有时您可以尝试运行无法编译的代

  • 我的应用程序中有一个接口: 这是后界面的一部分: 我还有一个用于后期草稿的接口,其中资产对象可能只是部分构建的 我希望允许对象具有部分资产对象,同时仍然检查属性的类型(因此我不想用替换它)。 我基本上想要一种能够生成以下内容的方法: 而无需完全重新定义接口。有办法做到这一点吗?如果不是,在这种情况下安排我的类型的明智方法是什么?