Generic Exception e catch 覆盖特定异常 Java



throw new ResponseError(new DefaultResponse)中生成错误时,我抛出了一个异常,当我输出消息时看起来不错,但随后它被catch(Exception e)块覆盖。如果上面生成了错误,我可以忽略通用catch吗?

这是我的网络服务

@DELETE
@SecureIt
@Consumes(value = { MediaType.APPLICATION_JSON })
@Produces(value = { MediaType.APPLICATION_JSON })
@Path("/training-courses/{emptcId}")
@ApiOperation(value = "Delete training course",
response = DefaultResponse.class,
authorizations = {
@Authorization(
value="Bearer" 
)
})
public Response deleteTrainingCourse(@ApiParam(value = "Employee Training Course Id", required = true) @PathParam("emptcId") Integer emptcId,
@Context ContainerRequestContext crc)
throws ResponseError {
ClsConnectionData connection = null;
try 
{
String mToken = crc.getProperty("token").toString();
connection = new ClsConnectionData(mToken);
StatementWrapper sw = new StatementWrapper(connection)
.createCall(" {CALL j2_employee.delete_training_course(?,?)} ")
.bind(1,emptcId)
.registerOutParameter(2, OracleTypes.CURSOR)
.invoke();
VoidResult voidResult = (VoidResult)sw.getSingleResultClass(2,VoidResult.class);
if(voidResult.errorGenerated()) {
throw new ResponseError(new DefaultResponse(ErrorCodes.DRIVEERROR.code(),
ResponseType.ERROR.getType(),
voidResult.getMessage(),
null));
//At this point we are throwing the exception
}
}
catch(Exception e)
{
//At the end this error is thrown
System.out.println("Exception e = " + e);
throw new ResponseError(e,true);
}
finally{
connection.disconnect();
}
DefaultResponse dt = new DefaultResponse("0",
ResponseType.SUCCESS.getType(),
"",
null); 
return Response.ok(dt).build();
}

catch(Exception e( 捕获任何类型为 Exception 的异常.class或 try-block 中抛出的 Exception 中的子类。所以,你把自己扔进尝试块的例外也是。如果 ResponseError 是 Exception 的子项,那么它也将被捕获。

您可以将 ResponseError 抛出尝试。如果您在尝试之前定义 voidResult 并检查错误之后生成,您将不再遇到该问题。你会得到这样的东西:

VoidResult voidResult = null;
try {
// some code getting to a voidResult
} catch (Exception e) { 
// some code dealing with this eception
}
if (voidResult != null && voidResult.errorGenerated()) {
// throw ResponseError
}

或者你应该确保 catch(异常 e(不会捕获所有异常,而只会捕获更具体的异常。如果这是一个选项,这取决于实现代码。假设如果你的实现代码只抛出 ConnectionException(举个例子(,你可以捕获 (ConnectionException( 而不是 Exception。如果 ResponseError 是 Exception 的子类,但不是 ConnectionException 的子类,则不会再捕获它。

您还可以执行以下操作:

DefaultResponse errorResponse = null
try {
// some code
if (voidResult.errorGenerated()) {
errorResponse = new DefaultResponse();
}
} catch (Exception e) { 
// deal with error
}
if (errorResponse != null) {
throw new ResponseError////

最后,您可以尝试查看您捕获的异常是否是您自己的异常并重新抛出它。

catch (Exception e) {
if (e instanceof ResponseError && ((ResponseError) e).getCode.equals(myCode)) {
throw e;
else { // etc.

如果要对常规异常进行特殊处理以区别于自定义异常,...

..然后你必须抓住...(自定义(例外优先!...然后抓住更普遍的...的。

喜欢:

// ...
catch (ResponseError respErr) {
System.out.println("ResponseError e = " + respErr);
// re-throw! - no "new"!
throw respErr;
}
catch (Exception e) {
// but as @mndeveci mentioned: no good style!
System.out.println("Exception e = " + e);
throw new ResponseError(e, true);
}
// ...

相关内容

  • 没有找到相关文章