当前位置: 首页 > 知识库问答 >
问题:

如果其中一个子方法引发异常,则跳过代码执行的最佳设计模式

公孙和怡
2023-03-14

我正在使用核心javahtml" target="_blank">开发一个测试框架。在我的应用程序中,我有一个父方法,它调用十个不同的子方法,每个方法都可以抛出自己的异常。要求是提供有关父方法执行的详细日志信息,其中包含执行该方法所用的总时间、执行每个子方法所用的时间、记录任何异常等信息。为此,我使用了多个try-catch-finally块。

我的问题是,如果其中一个子方法抛出异常,跳过剩余子方法执行的最佳方法是什么?例如:如果方法4抛出异常,我想记录该异常并转到末尾并记录父方法在此之前所花费的时间。

我尝试在父方法的开头使用布尔变量将其初始化为true。在执行每个子方法之前,我正在检查布尔变量是否为真。每当抛出异常时,我都会将布尔变量标记为false。

我的psuedocode看起来像这样:

public String parentMethod(){
    boolean execute = true;
    if(execute) {
        try event1; 
        catch(Event1Exception e1)  
            log e1; execute = false; 
        finally log event 1 time taken;
    }
    if(execute) {
        try event2; 
        catch(Event1Exception e2)  
            log e2; execute = false; 
        finally log event 2 time taken;
    }
    and so on ....
    log total time taken;

在我的实际代码中,我有大约十个不同的事件,它们抛出自己的异常,有时不止一个。使用这种方法,为每个捕获的异常分配execute=false,然后再次检查execute的值似乎很笨拙。在不使用任何额外插件的情况下,还有比这更好的方法吗?

共有3个答案

彭宏义
2023-03-14

如果您只对第一个异常感兴趣,那么您可以在单个try-catch块中执行所有事件,并处理catch块中的任何抛出的异常。

try {
    event1();
    event2();
    // etc
} catch(Exception e) {
    //Handle
}

否则,为每个进程启动一个线程,并通过在一个线程失败时立即终止所有其他线程来处理失败。

朱浩大
2023-03-14

Hi Sree我将推荐在单个try块中使用方法调用。在此try块的末尾写入所有具有不同异常的catch块。每当任何方法抛出异常时,控制将直接转到相应的catch块,跳过剩余的方法调用。

例如:

try
{
    method1(); // Exception1 occured
    method2(); // skipped
    method3(); // skipped
}
catch(Exception1 e)
{
    // control goes here
    // End timer 

    // Calculate difference
    // Store difference in global variable
}
catch(Exception2 e)
{
}
catch(Exception3 e)
{
}

method1()
{
    // start timer

    // your code

    // End timer, if no exception occurred
    // Store difference in global variable
}

希望这会有所帮助。:-)

嵇出野
2023-03-14

您可以只记录异常并重新显示它:

public String parentMethod(){
    try {
        try {
            ... 
        } catch(Event1Exception e1) { 
            log e1;
            throw e1;
        } finally {
            log event 1 time taken;
        }

        try {
            ... 
        } catch(Event2Exception e2) { 
            log e2;
            throw e2;
        } finally {
            log event 2 time taken;
        }

    } catch (Event1Exception | Event2Exception | ... e) {
        // Can be safely ignored
    }
}

或者,如果您不想单独处理每个异常,您可以这样做:

public String parentMethod(){
    try {
        try {
            ... 
        } finally {
            log event 1 time taken;
        }

        try {
            ... 
        } finally {
            log event 2 time taken;
        }

    } catch (Event1Exception | Event2Exception | ... e) {
        log e
    }
}
 类似资料:
  • 问题内容: 我想要一种一致且简单的方法来在JNI代码中引发异常;处理链式异常的东西(隐式地来自env-> ExceptionOccurred方法,或者由参数显式表示,无论哪种方式都不错),并且每次执行此操作时都无需查找构造函数。尽管我可以根据需要从C ++进行翻译,但上述所有内容最好都用C语言编写。 SO上是否有人可以分享这样的东西? 问题答案: 我们只是为要抛出的每种异常类型编写实用程序方法。这

  • 我有一个rest服务,它将抛出一个异常,我想知道什么将是最好的方式来处理这一点。 我想知道这是rest服务中处理异常的正确方式吗? 我在用泽西。

  • 我有一个超时执行任务的方法。我使用ExecutorServer.submit()获取一个Future对象,然后调用future.get()并超时。这很好,但是我的问题是处理我的任务可能抛出的检查异常的最好方法。下面的代码工作正常,并且保留了被检查的异常,但是如果方法签名中被检查的异常的列表改变了,它看起来非常笨拙并且容易出错。 关于如何解决这个问题的任何建议?我需要以Java 5为目标,但我也很好

  • 无论如何,如果能知道TestNG对错误的定义是什么样子,那就很好了。 谢谢你的任何提示!

  • 问题内容: 在下面的代码中,我试图一次性进行多个(大约10个)HTTP请求和RSS解析。 我在需要访问和解析结果的URI数组上使用标准构造。 码: 我了解一次调用函数时,应该使用回调。但是,在此示例中,我唯一想到使用回调的方法是调用一个函数,该函数对被调用的次数进行计数,并且仅在被调用的次数与看起来很hacky 的次数相同时才继续。 所以我的问题是, 在node.js中处理这种情况的最佳方法 是

  • 问题内容: 我正在编写一个Java程序,该程序读取一个单词文件。程序至关重要地依赖于此文件,因此,无论出于何种原因,在读取文件时都出现IOException,我确实希望程序结束。 结束程序的最佳方法是什么?我认为我被迫将文件读取包围在try / catch块中,因此我应该在catch中添加一个内部吗?例如,我应该做以下事情吗? 问题答案: 如果让异常一直传播到方法,程序将结束。无需调用,只需允许异