首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于在一个地方解决多个异常的ErrorHandler?

用于在一个地方解决多个异常的ErrorHandler?
EN

Stack Overflow用户
提问于 2014-03-07 12:02:04
回答 3查看 66关注 0票数 1

我有一个ServiceExecutor,运行一个很长的例程(调用、数据库更新、用户更新等等)。由于这些例程可能会导致多个错误,所以我想在一个地方捕获很多错误。所以我试着把它包起来。但是每个异常都应该得到一个自定义错误处理,因此将有5-10行代码来解决错误。

问题:我的runLongRoutine()太大了,所以我不得不考虑错误处理。但是我不想重新抛出这些输出,因为任何使用runLongRoutine()的类都不应该关心错误,甚至不知道可能会发生错误。

我如何适应这里的错误处理?有我可以选择的设计模式吗?

代码语言:javascript
运行
复制
class ServiceExecutor {
    void runLongRoutine() {
        try {
            several(param1);
            calls();
            to(param2);
            different(param3, param1);
            methods();
        } catch (CustomException e) {
            //5-10 lines of code
        } catch (IOException e) {
            //5-10 lines of code
        } catch (NetworkException e) {
            //5-10 lines of code
        }
        //to be continued
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-07 12:23:55

您可以轻松地将异常处理(针对每种类型的异常)和/或实际代码分解为单独的私有方法。

代码语言:javascript
运行
复制
class ServiceExecutor {
    void runLongRoutine() {
        try {
            runLongRoutine0();
        } catch (CustomException e) {
            //5-10 lines of code
        } catch (IOException e) {
            //5-10 lines of code
        } catch (NetworkException e) {
            //5-10 lines of code
        }
        //to be continued
    }

    private void runLongRoutine0() throws CustomException, IOException, NetworkException {
        several(param1);
        calls();
        to(param2);
        different(param3, param1);
        methods();
    }
}

代码语言:javascript
运行
复制
class ServiceExecutor {
    void runLongRoutine() {
        try {
            several(param1);
            calls();
            to(param2);
            different(param3, param1);
            methods();
        } catch (CustomException e) {
            handleCustomException(e);
        } catch (IOException e) {
            handleIOException(e);
        } catch (NetworkException e) {
            handleNetworkException(e);
        }
        //to be continued
    }

    private void handleCustomException(CustomException e) { ... }
    private void handleIOException(IOException e) { ... }
    private void handleNetworkException(NetworkException e) { ... }
}

如果真的有必要的话,甚至是这两种方法的结合。

票数 1
EN

Stack Overflow用户

发布于 2014-03-07 12:09:50

责任链模式可能会引起您的兴趣。另一种易于实现的方法是捕获任何异常,对我们来说是一个Map<Class<? extends Throwable>, Handler>,它将异常类型映射到异常处理程序。如果找不到任何默认处理程序,或者只是重新抛出它。

代码语言:javascript
运行
复制
try {
    // some code
} catch (Throwable e) {
    ExceptionHandler handler = handlers.get(e.getClass());
    if (handler != null) handler.handle(e);
    else DEFAULT_HANDLER.handle(e);
}
// to be continued
票数 1
EN

Stack Overflow用户

发布于 2014-03-07 12:27:44

你可能想试试AOP。您可以编写一个处理此方法周围异常的方面。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22249573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档