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

Hal*_*own 3 java coding-style exception-handling

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

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

    } 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();
    }
Run Code Online (Sandbox Code Playgroud)

另一个选择是分别捕获所有这些,如下所示:

    } 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.
Run Code Online (Sandbox Code Playgroud)

有没有一种首选的方法呢?我选择了第一种情况下(至少目前如此),因为它最大限度地减少重复的代码,但我也听说过这instanceofcatch (Exception)是撒旦的作品.

anu*_*ava 6

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

void handleException(String msg) {
   dialog.dismiss();
   showError(getString(msg));
   onDisconnect();
}
Run Code Online (Sandbox Code Playgroud)

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

} catch (ArrayIndexOutOfBoundsException e) {
        handleException(getString(R.string.bad_host));
    } catch (UnknownHostException e) 
        handleException(getString(R.string.unknown_host));
    } // ...etc.
Run Code Online (Sandbox Code Playgroud)