如何避免复制复杂的catch块?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (31)

我有这样的代码:

try {
    do_stuff();
    return do_more_stuff();
} catch (UnsupportedEncodingException e) {
    throw CustomException.programmer_error(e);
} catch (ProtocolException e) {
    throw CustomException.programmer_error(e);
} catch (MalformedURLException e) {
    throw CustomException.programmer_error(e);
} catch (SocketTimeoutException e) {
    throw new CustomException(e);
} catch (IOException e) {
    throw CustomException.unexpected_error(e);
}

我现在需要将所有这些catch块放在另一个类似的函数中。在这里避免重复的最好方法是什么?

请注意,两个try块内的代码不是很相似。

另外我也无法把这组捕获量提高。

请注意,我宁愿避免:

try {
    do_stuff();
    return do_more_stuff();
} catch (Exception e) {
    handle_exception_via_rtti(e);
}
提问于
用户回答回答于

就我个人而言,我会尽力去做

do_stuff();
return do_more_stuff();

部分符合更一般的格式以应用策略(作为模式)。

然后你可以重构所有你称之为这种块的地方,这样他们就可以调用一个更广义的块(这些块只布置一次)。

用户回答回答于

请注意,我宁愿避免:

然后,无论是与它一起生活,还是等到JDK7带有Multicatch以便你可以重写如下内容:

try {
    do_stuff();
    return do_more_stuff();
} catch (UnsupportedEncodingException | ProtocolException | MalformedURLException e) {
    throw CustomException.programmer_error(e);
} catch (SocketTimeoutException e) {
    throw new CustomException(e);
} catch (IOException e) {
    throw CustomException.unexpected_error(e);
}

你也可以把它移到构造函数中,CustomException并做一个(讨厌的)全局捕获,但是你需要添加一堆(讨厌的)if/else块来确定异常原因的类型。总而言之,我宁愿像以前那样坚持这种方式。

另一种选择是分割/重构可能将异常作为单独任务引发到另一个方法块中的行CustomException。例如

try {
    do_stuff_with_encoding();
    do_stuff_with_url();
    do_stuff_with_ws();
    // ...
    return do_more_stuff();
} catch (SocketTimeoutException e) {
    throw new CustomException(e);
} catch (IOException e) {
    throw CustomException.unexpected_error(e);
}

...

public SomeObject do_stuff_with_encoding() throws CustomException {
    try {
        do_stuff();
    } catch (UnsupportedEncodingException e) {
        throw CustomException.programmer_error(e);
    }
}  

public SomeObject do_stuff_with_url() throws CustomException {
    try {
        do_stuff();
    } catch (MalformedURLException e) {
        throw CustomException.programmer_error(e);
    }
}  

public SomeObject do_stuff_with_ws() throws CustomException {
    try {
        do_stuff();
    } catch (ProtocolException e) {
        throw CustomException.programmer_error(e);
    }
}  

扫码关注云+社区