在java中将方法更改为运行时异常

时间:2014-08-22 06:01:23

标签: java exception-handling

我有一个方法,现在我正在使用try catch方法处理异常。

我有一个自定义异常方法来处理错误。

现在我必须将此异常处理更改为运行时异常。

代码:

public class AppException extends RuntimeException {

    private static final long serialVersionUID = -8674749112864599715L;

    public AppException() {
    }

    public AppException(String message, Throwable cause,
            boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }

    public AppException(String message, Throwable cause) {
        super(message, cause);
    }

    public AppException(String message) {
        super(message);
    }

    public AppException(Throwable cause) {
        super(cause);
    }
}

使用try catch处理的方法。

@Transactional(readOnly = false)
@Override
public String save(StagingDocument stagingData)
        throws AppException {
    String enrichObjectId = null;
    try {
        EnrichDocument document = getEnrichDocument(stagingData);
        EnrichDocument enrichPayload = enrichStagingDocumentRepository
                .save(document);
        enrichObjectId = enrichPayload.getId().toString();
    } catch (Exception e) {
        logger.error("EXCEPTION IN SAVETOENRICHDOCUMENT METHOD: " + e);
        throw new AppException (e.getMessage(), e.getCause());
    }
    return enrichObjectId;
}

以上方法是AppException extends Exception class

时的实施方式

现在我需要根据runtime exception处理更改保存方法。

问题:

  1. 如何在不使用try catch方法的情况下更改此方法?

  2. 如果尝试捕获不存在exception如何处理?

3 个答案:

答案 0 :(得分:0)

如果您不使用try-catch块,则不会捕获原始Exception。如果它是RuntimeException,则不会出现编译错误,因为RuntimeExeption不需要被捕获。如果发生Exception,则只会从save()方法抛出它(它将被委派)。

如果原始Exception不是RuntimeException并且您不想使用try-catch块,则可以声明save()方法抛出ExceptionAppException 1}}但在这种情况下,它显然不是AppException的实例,而是原始的异常本身。

顺便说一下,如果您创建e,其原因应该是e.getCause()而不是e.getCause()。如果您将AppException作为e的原因,那么save()本身就会丢失。您可能还想添加自定义错误消息,而不是使用原始异常的消息。

摘要:如果您希望AppException方法在内部遇到Exception时抛出try-catch的实例,则不能在没有一个Exception块,你必须抓住它(里面遇到AppException)并像你一样将它包装在一个新的{{1}}中。

答案 1 :(得分:0)

RuntimeException不必在方法签名中声明,如果你想删除try / catch块,你可以这样做:

@Transactional(readOnly = false)
@Override
public String save(StagingDocument stagingData) {
        String enrichObjectId = null;
        EnrichDocument document = getEnrichDocument(stagingData);
        EnrichDocument enrichPayload = enrichStagingDocumentRepository
                .save(document);
        enrichObjectId = enrichPayload.getId().toString();
        return enrichObjectId;
}

当没有尝试/捕获时 - 例外没有得到处理"它是级联,直到更高级别处理它或直到最高级别存在该程序(使用RuntimeException)。

答案 2 :(得分:0)

不需要抓住

Runtime exceptions。如果您使用AppException作为已检查的例外,则仍然无需放置try/catch,因为您已使用方法签名中的throws处理了它。调用save()的方法必须处理AppException