Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java代码函数中捕获异常时的Java最佳实践_Java - Fatal编程技术网

Java代码函数中捕获异常时的Java最佳实践

Java代码函数中捕获异常时的Java最佳实践,java,Java,我想知道处理这种情况的最佳方法或最佳实践是什么。猜一个简单的函数,如下所示: public Object f1() { Object result = null; try { String payload = methodThrowsAnException(); result = payload; } catch (IOException e) { throw new IllegalStateExcepti

我想知道处理这种情况的最佳方法或最佳实践是什么。猜一个简单的函数,如下所示:

public Object f1() {
    Object result = null;
    try {
        String payload = methodThrowsAnException();         
        result = payload;
    } catch (IOException e) {
        throw new IllegalStateException(e);   <<<<<<<<<<<<<<<
    }

    return result;
}
public对象f1(){
对象结果=空;
试一试{
字符串有效负载=methodThrowsAnException();
结果=有效载荷;
}捕获(IOE异常){

抛出新的IllegalStateException(e);重新抛出捕获的异常是个坏主意。通常,stacktrace会包含有关您的体系结构的或多或少的详细信息。这对攻击者很有用

我不会允许我的应用因为用户的行为而进入非法状态。在你的情况下,我会说:

try {
    String payload = methodThrowsAnException();

    result = payload;
} catch (IOException e) {
    throw new IllegalArgumentException(<user's input which caused the exception>);   <<<<<<<<<<<<<<<
}
试试看{
字符串有效负载=methodThrowsAnException();
结果=有效载荷;
}捕获(IOE异常){

抛出新的IllegalArgumentException(如果在某个特定场景中您预期会出现异常,那么从方法返回null没有什么错

或者,您可以允许异常冒泡,并由调用方处理

何时捕获并重新抛出异常?何时我可以通过抛出新异常来传达更好的含义

当我抛出一个新的异常时,我会包括原始异常吗?如果它是一个未知/意外的场景,需要进一步调试,我会这样做

让我举几个例子:

  • 一些不可恢复的东西,如数据库连接中断。我会让异常冒泡出来。它应该在到达用户之前得到处理,并且可能会出现类似“服务不可用。请稍后重试”的一般错误消息
  • 与应用程序相关的内容…例如找不到备份文件。在这种情况下,我将吞掉
    FileNotFoundException
    ,而是抛出一个特定于我的应用程序的
    backupfilemissingeexception
    。这里我不需要包含
    FileNotFoundException
    ,因为这是一个预期的场景,并且没有进一步的调查
  • 我调用了其他一些API,它们抛出了一个未记录的异常。在这种情况下,我将把它转换为我的应用程序异常,例如
    InterfaceApeException
    ,并包含原始异常,以便可以在REST/Action层记录它以及根本原因

  • 如果要重新显示异常,首先不应捕获它,除非需要自定义代码。如果异常符合您的要求,则可以在出现异常时返回null