每当执行 catch 块时如何设置默认操作?

How to set up a default operation whenever a catch block get executed?

出于调试目的,我希望我的 Java 应用程序在执行 catch 子句时将日志文件上传到我的 MySql 数据库,而不管抛出哪个异常。

我认为最糟糕的解决方案是将我的上传器方法添加到代码中的每个 catch 中(正如我在创建日志文件时所做的那样)。这显然不是优雅的方法,只要它是重复的代码。所以我的问题是:它以某种方式存在(可能在项目属性中)设置一个默认操作,只要满足 catch 子句就执行?

如果不输入默认行为,就无法创建默认行为...创建一个全局方法,这样您就可以用一行代码调用它。

一个选择是使用日志框架(无论你自己写这个还是使用现有的解决方案),所以你可以这样做:

try{}
catch(Exception e) {Logger.logExceptionToDatabase(e); }

在这里你可以处理上传到你的数据库。但是,我认为每次执行 catch 块时将错误日志上传到数据库中并不是很有用。我会将它们写入单独的文本日志并收集它们,并且仅不时或根据用户请求将它们保存到数据库中。

对于问题本身:这是不可能的,但是有一个 finally 块在相应的 try 块之后执行(只要 JVM 没有在 try 块内终止) ).也许你可以引入一些 TransactionResult 并为每次成功和失败做一个日志记录,而不是:

TransactionResult transactionResult;

try{
//do work and at the last line in the try after each operation that could 
have failed has been executed set your transactionResult variable
transactionResult = new SuccessTransaction();
}
catch(Excpetion e) { transactionResult=  new FailureTransaction();}
finally {Logger.logTransaction(transactionResult); }

和相应的 类:

public interface TransactionResult{
  public void writeLog();

} 

以及交易结果示例:

public class SuccessTransaction implements TransactionResult{
private String resultStatus;

public SuccessTransaction() { this.resultStatus = "success"; }

public void writeLog() { System.out.println(this.resultStatus); } //or whatever you want to do with your result

}

你的失败实例也是如此。

更新

正如您所说的有很多异常,您也可以将异常传递给您的具体 FailureTransaction,而不是简单地写出该消息或将所有失败收集在一个列表中,然后您可以跟踪哪些异常已触发。

您可以执行以下操作:

public static void myMethod() throws FooException, BarException   {
    throw new FooException();
}

// if you don't care about specific catch cases:
public static void main(String[] args) throws FooException, BarException   {
    try {
        myMethod();
    } catch (Exception x) {
        x.printStackTrace(); // default behavior on exception
        throw x; // let the specific exception bubble up the call stack 
        // The compiler knows that this will be either FooException or BarException
    }
}

// if you need to also handle specific catch cases:
public static void main(String[] args) throws BarException {
    try { // outer try-catch, to handle specific exceptions
        try { // inner try-catch to handle default catch behavior
            myMethod();
        } catch (Exception x) { // Or } catch (FooException | BarException   x) {
            x.printStackTrace(); // default behavior on exception
            throw x; // let the exception bubble up to the specific catch clauses.
            // The compiler knows that this will be either FooException or BarException
        }
    } catch (FooException e) {
        System.err.println("Doing something specific to 'FooException'");
        // could re-throw if you want to
    } catch (BarException  e) {
        System.err.println("Doing something specific to 'BarException'");
        throw e; // only re-throw if you want to
    }
}

如果您不需要为特定异常做任何事情,那么第一个 main 应该可以正常工作。

如果您确实想在默认捕获行为之上处理特定异常,那么只需重新抛出异常,捕获它的具体内容,然后处理该特定情况.

当您希望异常在调用堆栈中向上冒泡时,您可以随时重新抛出异常。