4

将函数的大部分代码放在try statement. 如果我做一些需要 a 的事情try statement,我通常最终会在 try 语句中为该函数做很多工作,因为我通常在那里声明我的变量,并且如果我这样做,就不能在该范围之外使用它们。这是否普遍并被接受?人们是否通常在没有初始化变量之前声明变量,所以他们没有在 a 中做所有事情(包括对其他函数的调用)try statement?或者如果它很长也没关系?

4

4 回答 4

6

一个方法应该做一件事并且做好。在这种情况下,您的方法正在做两件事:业务逻辑和错误处理:

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
}
于 2013-02-16T18:56:24.503 回答
4

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

public void doComplexThing() {
    try {
        SomeObject o1 = doSomethingLessComplex();
        SomeOtherObject o2 = doSomethingElse(o1);
        doFinalThing(o2);
    }
    catch (SomeException e) {
        // handle the exception
    }
}
于 2013-02-16T18:56:42.263 回答
2

如果一个try块变得有点长,最好隔离实际上将异常抛出到它们自己的方法中的调用。这样,您就可以单独解决该块中可能引发的几种异常。

如果您试图测试或发现一个“神秘”的错误,那么try用一个普通的旧代码覆盖许多异常会在以后引起头痛。catch(Exception ex)更不用说诸如适当的资源/流处理之类的事情了,这是许多检查异常的目的。

于 2013-02-16T19:13:19.583 回答
0

作为一名高级程序员,我理解完美地使用 try catch 而不是抛出异常的语句与代码整洁之间的混淆。

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

首先让我们了解一下 try catch 的必要性。我们捕获异常,因为我们想在此时此地处理它。如果我们不把它扔给调用者。我们扔掉它是为了以后不会忘记处理它。从来没有,Oh!, let me finish this method and then I will worry about the exception handling later。在编写代码时执行此操作,想一想,您是否需要打印错误并返回 null,或者您是否需要用户知道有些事情搞砸了?您想将所有连接问题合并到recycle the connection一条消息中吗?如果是,则抛出您自己的自定义异常。但一定要处理好。忽略和做不好的异常处理是项目维护成本增加和客户烧心的根本原因。这就是好产品和马虎产品的区别。

As for code neatness, I have found that comments in catch blocks make it all worth your while. Yes, there will be someone senior to you who will not understand the importance of catching the exact statement, and will catch catch (Exception e) directly. Pathetic, I would say. But you should stick to your ethics when you code. Do it right and do it ONCE.

于 2013-02-17T05:39:39.933 回答