try
{
someTask();
someTask2();
someTask3();
someTask4();
someTask5();
}
catch (Exception e)
{
// log the error
}
如果我的任务之一失败,我想要记录发生的事情,但是我想继续运行其余的任务。我知道我可以用自己的try / catch包围每个任务方法,但是有没有一种更简洁的方法,所以我没有那么多try / catch块?
答案 0 :(得分:2)
最好的方法是让每个方法的内部都带有try
/ catch
。
void someMethod(){
try{
//code of method 1
}catch(Exception e){
e.printstackTrace()
}
}
,然后在没有try
/ catch
的情况下将其全部调用。
someTask();
someTask2();
someTask3();
someTask4();
someTask5();
现在,如果一个失败,另一个将继续。
答案 1 :(得分:2)
假设您的任务返回void
并且不带任何参数,则可以创建一个功能接口:
@FunctionalInterface
interface Task {
void perform() throws Exception;
}
然后创建一个帮助程序方法,该方法将处理日志记录并将Task
作为参数:
private static void invoke(Task task) {
try {
task.perform();
} catch (Exception e) {
// log here
}
}
然后使用它:
class MyClass {
public static void main(String[] args) {
invoke(MyClass::someTask);
invoke(MyClass::someTask1);
}
private static void someTask() throws Exception {
System.out.println("Task 1");
}
private static void someTask1() throws Exception {
throw new Exception("Exception");
}
}
答案 2 :(得分:0)
要运行其余任务,必须将每个任务放在单独的“ try”块中。这是一种干净的方法。否则,您将如何知道哪个任务失败以及如何调试它?
此外,将每个预期的错误从更具体的内容开始并以更一般的内容进行处理,将每个预期的错误分别放入catch块也被视为一种好习惯。这样您可以立即了解发生了什么问题并节省调试时间
try {
someTask1;
}catch (ClassNotFoundException e) {
// log the error
}catch (Exception e) {
// log the error
}
try {
someTask2;
}catch (ArithmeticException e) {
// log the error
}catch (ArrayIndexOutOfBoundsException e) {
// log the error
}catch (Exception e) {
// log the error
}
答案 3 :(得分:-2)
也许使用递归方法:
public void myMethod (int state){
try
{
switch(state) {
case 1:
state+=1;
someTask();
myMethod(state);
break;
case 2:
state+=1;
someTask2();
myMethod(state);
break;
case 3:
state+=1;
someTask3();
myMethod(state);
break;
default:
state=-1;
}
}
catch (Exception e)
{
// If some task had an exception, this catch call the next task, because the state variable incremented.
myMethod(state);
}
public static void main (String[] Args){
myMethod(1);
}
}