2013-02-16 31 views
4

是否有任何缺点将您的函数的大部分代码放在try statement中。如果我做的事情需要try statement,我通常最终会在try语句中为该函数做很多工作,因为我通常在那里声明我的变量,如果我这样做,就不能在该范围外使用它们。这是常见的并被接受吗?人们通常在不初始化的情况下声明变量,因此他们不会在try statement内部做所有事情(包括调用其他函数)?或者它是否很长很重要?长试语句

+2

不确定你在做什么,但是你可以初始化一个变量,使其在try块之外的某个默认值。 – nhahtdh 2013-02-16 18:54:49

+1

如果它让你恼火,你总是可以在你的方法头部添加一个'throws'子句,并且只将方法调用包装在'try/catch'块中。 – 11684 2013-02-16 18:55:57

+0

@nhahtdh或者根本不初始化:'int whatever;'在Java中有效。 – 11684 2013-02-16 18:56:37

回答

5

一种方法应该做一件事,做得好。在这种情况下,你的方法是做两件事情:业务逻辑和错误处理:

public Foo bar() { 
    try { 
     //business logic that may throw 
     //... 
     //end even more 
    } catch(BuzzException e) { 
     //Error handling 
    } 
} 

很多时候,我发现自己提取try块的内容到一个单独的方法没有错误处理:

public Foo bar() { 
    try { 
     return unsafeBar(); 
    } catch(BuzzException e) { 
     //Error handling 
    } 
} 

public Foo unsafeBar() throws BuzzException { 
    //business logic that may throw 
    //... 
    //end even more 
} 
3

它如果它很长很重要,但不是因为你的想法。这很重要,因为它会让您的代码难以阅读和测试。你最好是重构几种方法:

public void doComplexThing() { 
    try { 
     SomeObject o1 = doSomethingLessComplex(); 
     SomeOtherObject o2 = doSomethingElse(o1); 
     doFinalThing(o2); 
    } 
    catch (SomeException e) { 
     // handle the exception 
    } 
} 
2

如果try块开始有点长,这是一个好主意,这实际上是扔异常转换成自己的方法的调用隔离。这样你就可以单独处理可能在该块中抛出的几种异常。

如果您正在尝试测试或发现“神秘”错误,那么在try中覆盖很多例外情况,而旧式的catch(Exception ex)会引起头痛。这并不是说正确的资源/流处理,这是许多检查异常的东西。

1

作为一名高级程序员,我理解使用try catch完全胜过抛出异常的代码与代码整齐性之间的混淆。

在这里,我会倾向于try catch over the statements that need it

首先让我们了解尝试捕捉的必要性。因为我们想在这里和现在处理它,所以我们捕获异常。如果我们不把它扔给调用者。我们扔掉它,以便我们不会忘记稍后处理它。从来没有,Oh!, let me finish this method and then I will worry about the exception handling later。当你编码的时候这样做,想想,你需要打印一个错误并返回null,还是你需要用户知道某些事情搞砸了?你是否想将所有连接问题整合到recycle the connection有点消息?如果是,那么抛出你自己的自定义异常。但一定要处理它。忽略和执行错误的异常处理是项目维护和客户心脏烧伤成本增加的根本原因。这是一个好产品和一个草率产品的区别。

至于代码整洁,我发现在catch块的评论使它值得你一会儿。是的,会有一位高级的人不理解捕捉确切声明的重要性,并且会直接抓到catch (Exception e)。可悲,我会说。但是当你编码时,你应该坚持你的道德观。做对,做一次。