代码之家  ›  专栏  ›  技术社区  ›  pankajt

我应该从方法中抛出的异常数量有限制吗?

  •  2
  • pankajt  · 技术社区  · 17 年前

    public init(){
        try{
             initApplication();
         }catch(A1Exception){
    
         }catch(A2Exception){
    
         ...
         }catch(A5Exception){
    
         }
    }
    
    private void initApplication() throws A1Exception, A2Exception, A3Exception, A4Exception, A5Exception {
       initApp1(); //throws A1, A2, A3
       initApp2(); //throws A4, A5
    }
    

    以这种方式实现initApplication()有什么问题吗?

    9 回复  |  直到 7 年前
        1
  •  4
  •   Jim Ferrans    17 年前

    Joshus Bloch在 Effective Java ,我强烈推荐。

        2
  •  1
  •   Kalpak    17 年前

    我只想指出我遵循的一些建议。 2) 您可以设置异常类类别,如BusinessLogic Exception、InvalidDataException、SystemsException,这样您实际上可以从任何方法中抛出更少的异常。(除非你的业务要求完全例外

        3
  •  1
  •   akf    17 年前

    我认为抛出代码所需的任何异常都没有问题。当我看到这个例子时,我的第一印象是,这里可能会使用Exceptions来控制应用程序的流程。小心别那样做。例外情况只应在特殊情况下触发。

    不应通过Exceptions处理流程流的一个原因是,引发Exceptions是一个代价高昂的过程。尽管多个catch块的结构不应导致性能下降,但使用Exceptions控制流的(潜在的)底层流程将不会表现良好。

        4
  •  0
  •   Mitch Wheat    17 年前

    • 不,如果它们是“真正的”例外(即。

    问题2 你看到里面有臭味吗 initApplication()

    • initApplication() 可以预期会引发N个异常,即如果有N个异常情况,可能会阻止 initApplication()
        5
  •  0
  •   Kaleb Brasee    17 年前

    1.

    2. 但这不一定是个好主意,因为锅炉板代码过多会使其难以阅读。如果每个异常都将以相同的方式处理,那么您应该捕获基类exception。或者你可以让initApplication()抛出一个自定义异常——比如ApplicationInitializationException,它传达了更多关于出错原因的含义。您可以将异常的消息设置为确切的详细信息。

    在某些情况下,您可能会遇到5个不同的异常,并且可能必须以不同的方式处理所有异常。在这种情况下,捕获所有5个是正确的做法。但在实施之前,值得考虑一下这是否真的有必要。

        6
  •  0
  •   mfeingold    17 年前

        7
  •  0
  •   Billy Bob Bain    17 年前

    从纯粹的技术角度来看 class 文件格式引入了一个上限 65536 u2 类型 exceptions_table_length 是无符号双字节量的简写。

    The Code attribute has the following format:

    Code_attribute {
     u2 attribute_name_index;
     u4 attribute_length;
     u2 max_stack;
     u2 max_locals;
     u4 code_length;
     u1 code[code_length];
     u2 exception_table_length;
     {     u2 start_pc;
            u2 end_pc;
            u2  handler_pc;
            u2  catch_type;
     } exception_table[exception_table_length];
     u2 attributes_count;
     attribute_info attributes[attributes_count];
    }
    

    Section 4.10 Limitations of the Java Virtual Machine .

        8
  •  0
  •   Fredrik    17 年前

    我想这个答案主要与第二季度有关,但对它的看法并不那么技术性,但无论如何都值得考虑,这是以下两个问题背后的原因吗?

    • 用户把它们都抓起来有意义吗?
    • 你想冒险让用户厌倦拥有大量的catch块,而只是插入一个“catch(Exception ex){//ex.printStackTrace();//如果我们看到问题就启用它}”或类似的愚蠢的东西吗。?

    在这种情况下,我想这可能不相关,但我认为在做API设计时,这是值得考虑的。

        9
  •  0
  •   Jens Schauder    17 年前

    除非你打算在捕获到异常时采取行动,否则不要抛出任何异常。将选中的异常转换为运行时异常,以便记录日志。

    有关该主题的更多信息,请参阅 here

        10
  •  0
  •   nimcap    17 年前