即使methodC1()存在异常,我也需要执行methodC2。这里我只添加了两个方法,如methodC1()和methodC2()。让我们说有很多方法。在这种情况下,解决方案也应该适用。
abstract class A {
abstract String methodC1() throws ExceptionE;
abstract String methodC2() throws ExceptionE;
protected String methodA() throws ExceptionE2 {
try {
methodC1();
methodC2();
} catch (ExceptionE e) {
throw new ExceptionE2();
}
}
}
class C extends A {
String methodC1() throws ExceptionE {
// do something
}
String methodC2() throws ExceptionE {
// do something
}
}
答案 0 :(得分:0)
通常,您不希望从同一方法的异常中恢复。
如果您真的需要这样做,您可以将“很多”方法打包到其他方法,如果可以的话,他们可以分享业务逻辑和异常处理。 例如,如果上述失败,则可能不应运行方法。
此外,您可以在自己的try catch中使用每个方法,以便继续执行。
或者你可以制作一个执行列表,以便在for循环中执行它们。
答案 1 :(得分:0)
不要使用throws ExceptionE
而是在methodC1和methodc2上使用try catch块。
abstract class A {
abstract String methodC1 ();
abstract String methodC2 ();
protected String methodA (){
methodC1();
methodC2();
}
}
class C extends A {
String methodC1 () {
try{
//code
} catch (ExceptionE e) {
//handle exception
}
}
String methodC2 () {
try{
//code
} catch (ExceptionE e) {
//handle exception
}
}
}
答案 2 :(得分:0)
这是一种方式:
protected String methodA() throws ExceptionE2 {
try {
methodC1();
} catch (ExceptionE e) {
throw new ExceptionE2(); // HERE
} finally {
try {
methodC2();
} catch (ExceptionE e) {
throw new ExceptionE2(); // THERE
}
}
如果methodC1
和methodC2
都抛出异常,则从ExceptionE2
传播的methodA
是finally
块内抛出的// THERE
;即// HERE
第一个(抛出的methodC1
)被“吃掉”。
还有其他方法可以处理这个要求,但这个方法最简单,并且不需要更改methodC2
和ExceptionE
的签名。
如果您需要传播编码来自ExceptionE2
个例外的错误信息的异常,那么您将需要重新设计protected String methodA() throws ExceptionE2 {
List<ExceptionE> exceptions = new ArrayList<>();
try {
methodC1();
} catch (ExceptionE e) {
exceptions.add(e);
}
try {
methodC2();
} catch (ExceptionE e) {
exceptions.add(e);
}
if (!exceptions.isEmpty()) {
throw new ExceptionE2(exceptions);
}
}
以便它可以包装多个异常。 (两个例外不可能在Java中同时传播......或者我所知道的任何其他编程语言。)
最终结果可能如下所示:
Employees
- employee_id
- name
- email
- password
- is_manager
- listOfProjects // There are list/map or Set data type which can be used
- listOfSkills
Projects
- project_id
- title
- description
- owner
- manager
Skills
- skill_id
- skill
答案 3 :(得分:0)
在try-catch中添加Finally块可以解决您的问题。无论catch块中的操作结果如何,最后都被调用。
try{
methodC1();
}
catch(ExceptionE e){
throw new ExceptionE2();
}
finally{
methodC2();
}