2011-04-01 35 views
3

对于以下情况,有没有规范的最佳做法?在Java中以类似的方式处理多个异常的最佳实践

我有一段代码,可以生成一些不同的例外,每个例外都是通过隐藏对话框,显示错误消息并运行一个onDisconnect()方法来处理的。问题在于,对于每个异常,错误消息都需要不同。正如我所看到的那样,有两种选择。首先是使用instanceof赶上Exception,然后处理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. 

有没有一种首选的方法来做到这一点?我选择了第一种情况(至少现在是这样),因为它使重复代码最小化,但我也听说和catch (Exception)是撒旦的作品。

回答

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. 
+0

已经有这种解决方案的几个评论,但你用了几分钟打出来。我喜欢这个解决方案;现在执行它。谢谢! – 2011-04-01 23:01:29

+0

如果你不希望添加一个新的处理方法,你可以这样做,因为Java 7的尝试{...}赶上(Exception1 | Exception2前){ex.printStackTrace();} – 2016-04-11 02:24:33

2

使处理错误的(私人无效)方法。您可能需要通过一些参数传递它,但行为会一致。当您对该方法进行更改时,它会更改所使用的所有位置,因此您可以减少样板代码。

try { 
    // stuff 

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

你想分开抓住它们。如果赶上一般例外,你可能最终赶上,你没想到(可能从别的地方在堆栈例如拉高)异常,你就从传播最多的地方,他们其实是要阻止他们被处理。

(后来编辑):你可能还需要考虑使用finally避免了一些代码重复的问题。

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(); 
    } 

我同意,这样的instanceof用法是撒旦的工作......