假设下面的代码是某个程序(Java)的一部分:
function z(){
try{
//some code here, that might throw exceptions.
}catch (SomeException | SomeOtherException e){
//some exception handling here.
}
function y(){
z();
}
function x(){
y();
}想象一下,如果在函数z中抛出异常SomeException或SomeOtherException,函数x和y将不会按预期执行。我们想要编写代码,让函数x和y知道在函数z中抛出了异常,并使它们相应地执行。做这件事最好的方法是什么?
function z() thrown FunctionZFailedException{
try{
//some code here, that might throw exceptions.
}catch (SomeException | SomeOtherException e){
throw new FunctionZFailedException();
}
}
function y() throws FunctionYFailedException{
try{
z();
}catch (FunctionZFailedException e){
throw new FunctionYFailedException();
}
}
function x(){
try{
y();
}catch (FunctionYFailedException e){
//Do something, like alerting user that something went wrong.
}
}这是不是太过分了,那就是声明新的异常,唯一的目的是“转发”其他异常到更高的级别?
我认为我们也可以让SomeException和SomeOtherException在函数x中捕获它们,但这可能会弥补可读性较差的代码,
例如,如果函数z中捕获的异常是SQLException和NoSuchAlgorithmException,而函数y是一个登录()函数。然后函数x会尝试调用login(),要么捕获一个SQLException | NoSuchAlgorithmException,如果让这些异常简单地飞到最高级别,要么捕获一个LoginFailedException,如果我们立即捕获每个异常,并让它们抛出新的异常。似乎捕获LoginFailedException会使代码更具可读性。
Imo这两种方式都有它们的缺点(代码可读性较差,引入了许多异常),我想知道经验丰富的java程序员通常如何处理类似的情况。
任何关于异常的一般想法也很感谢各位
发布于 2016-04-19 22:16:21
当您查看您的代码(以及方法和异常的名称)时,找出这些方法及其抛出的异常是否在同一抽象级别。
如果您有一个getInputStream()方法,那么适当的异常应该是一个IOException。如果在getDatabaseConnection()中调用该方法,则应该捕获IOException并抛出SQLException。如果您的saveCustomerToDatabase()方法需要此方法,那么您应该抛出类似于ProcessFailedException的东西。
我不是一个很喜欢写javadoc的人,但有时你应该问问自己:我能用同样的语言(即技术语言、商业语言等)为这个方法及其异常写出好的javadoc吗?如果saveCustomerToDatabase() -Method抛出IOException,那么为它编写javadoc就会遇到麻烦。
发布于 2016-04-19 22:11:55
如果您对z()方法的当前设计很满意,并且希望y()和x()方法“知道”z()中发生了一些不好的事情,那么您可以让z()在吞噬异常之后重新抛出它。
public void z() {
try {
// some code here, that might throw exceptions.
} catch (SomeException | SomeOtherException e) {
// handle the exception and then rethrow it
logger.log("An exception happened in z().");
throw e;
}
}
public void y() {
try {
z();
} catch(Exception e) {
// handle problem with z() and rethrow the exception
logger.log("An exception happened when calling z().");
throw e;
}
}
public void x() {
try {
y();
} catch(Exception e) {
// handle problem with y()
logger.log("An exception happened when calling y().");
}
}https://stackoverflow.com/questions/36720778
复制相似问题