每当执行 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
应该可以正常工作。
如果您确实想在默认捕获行为之上处理特定异常,那么只需重新抛出异常,捕获它的具体内容,然后处理该特定情况.
当您希望异常在调用堆栈中向上冒泡时,您可以随时重新抛出异常。
出于调试目的,我希望我的 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
应该可以正常工作。
如果您确实想在默认捕获行为之上处理特定异常,那么只需重新抛出异常,捕获它的具体内容,然后处理该特定情况.
当您希望异常在调用堆栈中向上冒泡时,您可以随时重新抛出异常。