【问题标题】:Exception classes organization in JavaJava中的异常类组织
【发布时间】:2012-04-12 16:44:44
【问题描述】:

我有很多异常类。 F.e.:InvalidMethodParameterException、EntityNotFoundException 等。都有一些代码,如 xxx.yyy.zzz 和描述文字。 问题是:是否有任何最佳实践和技术来组织课程及其代码/文字。目前,我正在做的是将所有代码和文字放在其他类甚至属性文件中((。在我看来,这非常令人沮丧,因为要添加一个异常,我必须对其他文件进行另一项更改,而不是一个.为了抛出异常,我使用了一个带有静态方法的类,它抛出它们。这些方法和方法不是我创建的,而是我工作的地方。所以我想提供其他更有效的方法。例如,当我提供使用只是简单地将每个异常文字和代码存储在自己的类中,他们只是忽略了说这是低效和不好的做法。

任何帮助将不胜感激!

【问题讨论】:

  • 我更喜欢将与异常相关的错误代码保存在使用它们的异常类中。但是,要说服喜欢将所有错误代码保存在一个地方的人可能会很困难,因为所有这些都在一个地方可以让您在一个地方很好地查看所有错误代码。

标签: java exception code-organization file-organization


【解决方案1】:

我认为提高开发人员效率的系统架构将远远优于提高执行效率的系统架构,因为前者可以轻松包含后者。如果对单个模块进行更改需要您打开和修改多个模块,则该设计并没有提高开发人员的效率。 My very favorite programming book 建议异常类型由异常处理程序驱动。类似于以下内容:

Version 1:
void tryToDoSomething(bool arg) {
    try {
        doSomething(arg); //Throws MyException
    } catch (MyException e) {
        if (e.errorMessage == "Try a different argument")
            tryToDoSomething(!arg);
        else if (e.errorMessage == "Try again")
            tryToDoSomething(arg);
    }
}
Version 2:
//Split the exception so that it can be handled differently
void tryToDoSomething(bool arg) {
    try {
        doSomething(arg); //Throws InvalidArgumentException, NotReadyException
    } catch (InvalidArgumentException e) {
        tryToDoSomething(!arg);
    } catch (NotReadyException e) {
        tryToDoSomething(arg);
    }
}

除了自我记录之外,现代编译器还可以优化抛出以显着加快第 2 版。这就是为什么实际上会创建异常,因为编译器可以理解的用户定义类型来替换以前必须传递和手动检查的钝错误代码。

无论如何,如果错误代码旨在传达给用户,我认为它们不是异常而是错误,应该这样抛出。您可能会设计类似 ErrorFactory 的东西,它会接受一个字符串错误代码并抛出正确的派生类型,或者您可以直接抛出。另一方面,如果错误代码没有到达用户,为什么还要使用它们呢?

【讨论】:

  • 就是这样 (+1)。 (关于参考:我觉得这本书是“干净的代码”比你最喜欢的编程书更有趣;)
  • @DaveBall 啊,是的,这只是一些夸大的自我重要性,根本不介意:D
【解决方案2】:

您可以将它们全部集中到一个类中,这会将所有内容都放在一个外部类中:

public OurExceptionsClassTM {

    static final String
        ERROR1 = "123.acd.243",
        ERROR2 = "124.axd.543",
        ... ;

    public static class InvalidMethodParameterException extends Exception { ... }
    ...

    public static throwSpecialException(){ ... }
    ...

}

这解决了必须更改多个文件的问题,并且或多或少地保持了同事习惯的方式。

您还可以使其更加模块化,例如为每个项目设置不同的外部扩展类。关键是与任何给定异常相关的所有内容仍将与该异常保持在一起。

【讨论】:

    猜你喜欢
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2012-03-18
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多