Общее исключение e catch перезаписывает конкретное исключение Java - PullRequest
0 голосов
/ 05 июля 2018

Я генерирую исключение, когда ошибка генерируется в 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();
}

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Функция catch (Exception e) перехватывает любое исключение типа Exception.class или подкласс из Exception, которое выдается в блоке try. Таким образом, исключение вы бросаете себе в блок try. Если ResponseError является подклассом Exception, то он также будет перехвачен.

Вы можете выбросить ResponseError вне попытки. Если вы определите voidResult до того, как попытаетесь выполнить проверку errorGenerated после, у вас больше не возникнет этой проблемы. Вы получаете что-то вроде этого:

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 (Exception e) охватывает не все исключения, а только более конкретные. Это зависит от кода реализации, если это варианты. Скажем, если ваш код реализации только выбрасывает ConnectionExceptions (чтобы назвать пример), вы можете поймать (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.
0 голосов
/ 05 июля 2018

Если вам нужна специальная обработка общих исключений в отличие от пользовательских, ...

.. тогда вы должны сначала поймать ... (пользовательские) исключения! ... а затем поймать более обобщенные ... из них.

Как:

// ...
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);
}
// ...
...