在发现异常后返回 null 设计错误 [已关闭]

2022-09-01 11:09:17

我总是遇到同样的问题,当在具有非空值返回值的函数中捕获异常时,我不知道要返回什么。以下代码片段说明了我的问题。

public Object getObject(){
  try{
    ...
    return object;
  }
  catch(Exception e){
    //I have to return something here but what??
    return null; // is this a bad design??
  }
}

所以我的问题是:

  • 返回 null 是不是设计不好?
  • 如果是这样,什么被视为更清洁的解决方案?

谢谢。


答案 1

我会说,如果你真的无法处理它,不要抓住异常。日志记录不被视为处理错误。最好通过抛出异常来将其冒泡给可以的人。

如果你必须返回一个值,而 null 是唯一明智的事情,那就没什么错。只需记录下来,并向用户明确应该做什么。有一个单元测试,显示正在引发的异常,以便开发人员可以看到接受的成语需要什么。它还将进行测试,以确保您的代码在应该引发异常时引发异常。


答案 2

我总是遇到同样的问题,当在具有非空值返回值的函数中捕获异常时,我不知道要返回什么。

如果您不知道要返回什么,则意味着您不知道如何处理异常。在这种情况下,请重新投掷它。请不要默默地吞咽它。请不要返回 null,您不想强制代码的调用方编写:

Foo foo = bar.getFoo();
if (foo != null) {
    // do something with foo
} 

恕我直言,这是一个糟糕的设计,我个人讨厌必须编写空检查(很多时候,在应该抛出异常的地方使用null)。

因此,正如我所说,在方法中添加一个子句,要么完全远程化try/catch块,要么在有意义的情况下保留try/catch(例如,如果您需要处理多个异常),并按原样重新抛出异常或将其包装在自定义异常中。throws

相关问题