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

用于异常处理的“开关”等价物

程景胜
2023-03-14
  • GWT:public void onFailure(捕获可抛出)AsyncCallback接口的实现。
  • JAX-RS:Public Response to Response(E throwable)ExceptionMapper 接口的实现。

以上两种方法都接收throwable的实例。通常,我见过开发人员使用一个简单的“if/else if”块来区分处理逻辑:

// As specified by the AsyncCallback class of the GWT framework
public void onFailure(Throwable caught) {
    if (caught instanceof AnException) {
        // handle AnException
    } else if (caught instanceof AnotherException) {
        // handle AnotherException
    } else if (caught instanceof YetAnotherException) {
        // handle YetAnotherException
    } else if (caught instanceof ...) {
        // and so on...
    }
}

由于许多原因,我不喜欢“if/else if”块,所以我想出了以下“模式”,它将“if/else if”块转换为“try/catch”块,就像它是“switch”块一样:

public void onFailure(Throwable caught) {
    try {
        throw caught;
    } catch(AnException e1) {
        // handle AnException
    } catch(AnotherException e2) {
        // handle AnotherException
    } catch(YetAnotherException e3) {
        // handle YetAnotherException
    } catch(...) {
        // and so on...
    }
}

我的问题是:在性能、最佳实践、代码可读性、一般安全性或其他我没有考虑到或注意到的东西方面,使用这种方法有没有缺点?

共有1个答案

殳宸
2023-03-14

在正常情况下使用异常来指导程序流是一种代码气味,但这并不是您在这里真正要做的。我认为你可以逃脱惩罚有几个原因:

>

  • 我们已经基于各种原因捕获和重新抛出异常(例如,“捕获、采取某些操作、传播”)。这在意图上有点不同,但在成本上并不差。

    您已经承担了至少一次引发此异常的代价。你可能会因为它的原因被抛出、捕获、包装或重新抛出而付出代价。填充堆栈痕迹的费用已经支付。再次重新引发已经填充的异常不会增加复杂度。

  •  类似资料:
    • 问题内容: 我以前没有听说过,但是我对Python还是比较陌生。异常处理意味着动态调用和静态返回,而语句是静态调用,静态返回。 如何进行检查是好是坏,似乎正好相反。谁可以给我解释一下这个? 问题答案: 您可能会发现这篇文章很有帮助: 尝试/除Python以外的性能:简单测试 ,Patrick Altman进行了一些简单的测试,以了解在各种条件下进行条件检查(在这种情况下特定于字典键)的性能(仅针对

    • 本文向大家介绍关于ThinkPHP中的异常处理详解,包括了关于ThinkPHP中的异常处理详解的使用技巧和注意事项,需要的朋友参考一下 什么是异常 从更加广泛的角度来看,异常包含两个方面,一方面是程序执行时由于语法、运行时错误等导致的异常,一方面时没有给予正确的反馈,如客户端要查询某个产品,没有查询到,我认为这也属于异常的一种。 第一种异常TP框架本身会在页面中输出错误信息,但是第二种异常则一般不

    • 本文向大家介绍关于.NET异常处理的思考总结,包括了关于.NET异常处理的思考总结的使用技巧和注意事项,需要的朋友参考一下 年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于java与.net的博文出现,我表示要作为一个吃瓜群众,静静的看着大佬们发表心情。 以上的废话说的够多了,这里就不再废话了,还是切入正题吧

    • 我想在Spring中处理某些异常并将REST响应包装成另一种对象格式。 因此,我想到了使用过滤器并检查响应状态代码的想法,例如,如果是400,则意味着请求不正确,因此我可以将响应包装为所需的JSON格式,下面是代码示例: 将特定异常的响应封装在过滤器中是一种好方法吗?这种情况的缺点是什么?

    • 我愿意使用FaceTracker示例这个,即在项目中添加emgu.cv.world dll然后它显示我。 无法加载模块。

    • 问题内容: 异常处理中的块究竟执行什么功能? 问题答案: 它包含应始终执行的代码,无论是否发生异常。 例如,如果您打开了一个文件,则应在块中将其关闭,以确保始终关闭该文件。如果在块中将其关闭,则较早的异常将导致执行直接跳到该块并跳过关闭文件。 有关更多详细信息,请参见Java教程。