在Java中以类似方式处理多个异常的最佳实践

时间:2011-04-01 22:38:10

标签: java exception-handling coding-style

对于以下情况,是否有规范的最佳方法?

我有一个代码块可以生成许多不同的异常,每个异常都是通过隐藏对话框,显示错误消息和运行onDisconnect()方法来处理的。问题在于,对于每个异常,错误消息都需要不同。我认为,有两种选择。第一个是捕获Exception,然后使用instanceof处理catch块内的各种异常,如下所示:

    } catch (Exception e) {
        dialog.dismiss();

        String errorMessage = getString(R.string.default_error);
        if (e instanceof ArrayIndexOutOfBoundsException) 
            errorMessage = getString(R.string.bad_host); 
        else if (e instanceof UnknownHostException) 
            errorMessage = getString(R.string.unknown_host);
        else if (e instanceof NumberFormatException) 
            errorMessage = getString(R.string.bad_port);
        else if (e instanceof IOException)
            errorMessage = getString(R.string.no_connection);
        showError(errorMessage);

        onDisconnect();
    }

另一种选择是分别捕捉所有这些,如下:

    } catch (ArrayIndexOutOfBoundsException e) {
        dialog.dismiss();
        showError(getString(R.string.bad_host));
        onDisconnect();
    } catch (UnknownHostException e) 
        dialog.dismiss();
        showError(getString(R.string.unknown_host));
        onDisconnect();
    } // ...etc.

有没有首选方法可以做到这一点?我选择了第一个案例(至少目前为止),因为它最大限度地减少了重复的代码,但我也听说instanceofcatch (Exception)是撒旦的作品。

4 个答案:

答案 0 :(得分:6)

我的偏好是有一个像这样的单独方法:

void handleException(String msg) {
   dialog.dismiss();
   showError(getString(msg));
   onDisconnect();
}

然后在你的代码中抛出异常就像这样:

} catch (ArrayIndexOutOfBoundsException e) {
        handleException(getString(R.string.bad_host));
    } catch (UnknownHostException e) 
        handleException(getString(R.string.unknown_host));
    } // ...etc.

答案 1 :(得分:3)

你想分开捕捉它们。如果你捕获了通用的Exception,你可能最终会捕获你不期望的异常(例如,可以从堆栈中的其他位置向上推送),并且你阻止它们传播到它们实际意图的任何地方被处理。

(稍后编辑):您可能还希望使用finally来避免一些代码重复问题。

答案 2 :(得分:2)

创建一个(private void)方法来处理错误。您可能需要在某些参数中传递有关正在发生的事情,但行为将保持一致。当您对方法进行更改时,它会更改所有使用它的位置,因此您可以减少样板代码。

try {
   // stuff

} catch(OneException) {
    handleSimilarExceptions();
} catch(TwoException) {
    handleSimilarExceptions();
} catch(DifferentException) {
    log.write("Something wierd happened, handling it");
    somethingDifferent();
}

答案 3 :(得分:1)

如果你像改进的第二版那样做了什么:

   catch (ArrayIndexOutOfBoundsException e) {
        handleException(R.string.bad_host);
    } catch (UnknownHostException e) 
        handleException(R.string.unknown_host);
    } // ...etc.

  void handleException(String s) {
        dialog.dismiss();
        showError(getString(s));
        onDisconnect();
  }

我同意,像这样使用的例子是撒旦的作品......