Android:java-错误处理程序

8 篇文章 0 订阅
1 篇文章 0 订阅

错误处理程序

Android 和 Java 的错误处理库
将错误处理逻辑封装到符合可配置默认值的对象中。然后将它们作为参数传递或通过 DI 注入它们。

下载

下载最新的 JAR或通过 Maven 获取:

<dependency>
  <groupId>com.workable</groupId>
  <artifactId>error-handler</artifactId>
  <version>1.1.0</version>
  <type>pom</type>
</dependency>

或摇篮:

compile 'com.workable:error-handler:1.1.0'

用法

假设我们正在构建一个同时使用网络和本地数据库的消息传递 Android 应用程序。
我们要:

设置一个默认的 ErrorHandler 一次

  • 配置默认的ErrorHandler
  • 更容易使用的代码的别名错误,如整数、字符串和枚举值
  • 将错误映射到发生这些错误时要采取的操作(抛出异常)
// somewhere inside MessagingApp.java

ErrorHandler
  .defaultErrorHandler()

  // Bind certain exceptions to "offline"
  .bind("offline", errorCode -> throwable -> {
      return throwable instanceof UnknownHostException || throwable instanceof ConnectException;
  })

  // Bind HTTP 404 status to 404
  .bind(404, errorCode -> throwable -> {
      return throwable instanceof HttpException && ((HttpException) throwable).code() == 404;
  })

  // Bind HTTP 500 status to 500
  .bind(500, errorCode -> throwable -> {
      return throwable instanceof HttpException && ((HttpException) throwable).code() == 500;
  })

  // Bind all DB errors to a custom enumeration
  .bindClass(DBError.class, errorCode -> throwable -> {
      return DBError.from(throwable) == errorCode;
  })

  // Handle HTTP 500 errors
  .on(500, (throwable, errorHandler) -> {
    displayAlert("Kaboom!");
  })

  // Handle HTTP 404 errors
  .on(404, (throwable, errorHandler) -> {
    displayAlert("Not found!");
  })

  // Handle "offline" errors
  .on("offline", (throwable, errorHandler) -> {
    displayAlert("Network dead!");
  })

  // Handle unknown errors
  .otherwise((throwable, errorHandler) -> {
    displayAlert("Oooops?!");
  })

  // Always log to a crash/error reporting service
  .always((throwable, errorHandler) -> {
    Logger.log(throwable);
  });

在 catch 块中使用 ErrorHandler

// ErrorHandler instances created using ErrorHandler#create(), delegate to the default ErrorHandler
// So it's actually a "handle the error using only defaults"
// i.e. somewhere inside MessageListActivity.java
try {
  fetchNewMessages();
} catch (Exception ex) {
  ErrorHandler.create().handle(ex);
}

使用 ErrorHandler.run 运行代码块

ErrorHandler.run(() -> fetchNewMessages());

需要时覆盖默认值

// Configure a new ErrorHandler instance that delegates to the default one, for a specific method call
// i.e. somewhere inside MessageListActivity.java
try {
  fetchNewMessages();
} catch (Exception ex) {
  ErrorHandler
    .create()
    .on(StaleDataException.class, (throwable, errorHandler) -> {
        reloadList();
        errorHandler.skipDefaults();
    })
    .on(404, (throwable, errorHandler) -> {
        // We handle 404 specifically on this screen by overriding the default action
        displayAlert("Could not load new messages");
        errorHandler.skipDefaults();
    })
    .on(DBError.READ_ONLY, (throwable, errorHandler) -> {
        // We could not open our database to write the new messages
        ScheduledJob.saveMessages(someMessages).execute();
        // We also don't want to log this error because ...
        errorHandler.skipAlways();
    })
    .handle(ex);
}

要知道的事情

ErrorHandler 是线程安全的。

API

初始化

  • defaultErrorHandler()获取默认的 ErrorHandler。
    -create() 创建一个链接到默认错误处理程序的新错误处理程序。
  • createIsolated()创建一个未链接到默认错误处理程序的新空错误处理程序。

配置

  • on(Matcher, Action)如果Matcher匹配错误,则注册要执行的Action 。
  • on(Class<? extends Exception>, Action)如果error是Exception。
  • on(T, Action)如果错误绑定到 T,则通过或注册要执行的操作。bind()bindClass()
  • otherwise(Action)注册一个只有在没有其他动作被执行时才会执行的动作。
  • always(Action)注册一个要始终执行的操作,并在所有其他操作之后执行。像finally从句一样工作。
  • skipFollowing()跳过任何后续动作的执行,除了那些通过注册的动作always()。
  • skipAlways()跳过通过注册的所有操作always()。
  • skipDefaults()跳过任何默认操作。defaultErrorHandler表示在实例上注册的任何操作。
  • bind(T, MatcherFactory)通过MatcherFactory提供的匹配器绑定T的实例以匹配错误。
  • bindClass(Class, MatcherFactory)通过MatcherFactory提供的匹配器绑定类T以匹配错误。
  • clear()清除所有注册的动作。

执行

  • handle(Throwable)处理给定的错误。

关于

在针对错误进行设计时,我们通常需要:
1.每个预期错误都有一个默认处理程序// 即网络,订阅错误
2.根据发生的地点和时间适当处理特定错误// 即上传文件时出现网络错误,登录无效
3.对未知错误有一个包罗万象的处理程序// 即我们没有预料到的系统库运行时错误
4.保持我们的代码干燥
Java,作为一种语言,为您提供了一种方法来完成上述工作。通过将横切错误映射到运行时异常并在调用堆栈中捕获它们的较低位置,同时将特定的预期错误映射到已检查的异常并在错误发生的位置附近处理它们。尽管如此,这个简单的策略已经误入歧途的项目不计其数,很多错误要么被吞没,要么被包揽了Thread.UncaughtExceptionHandler。此外,它通常带有重要的样板代码。ErrorHandler然而,通过其流畅的 API、错误别名和默认机制简化了这种做法。
这个库不会尝试解决 Java 特定的问题,尽管它确实有助于log and shallow反模式,因为它提供了一种自以为是且直接的方式来在每个catch块中进行操作。它是为满足 Android 应用程序的需求而创建的,并且很快就证明自己很有用。所以它也可能对你有用。如果你喜欢这个概念并且你正在使用 Swift或Javascript进行开发,我们正在烘焙它们,并且很快就会推出。

执照

The MIT License

Copyright (c) 2013-2016 Workable SA

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

小结

有了这么多优秀的开发工具,可以做出更高质量的Android应用。

当然了,“打铁还需自身硬”,想要写出优秀的代码,最重要的一点还是自身的技术水平,不然用再好的工具也不能发挥出它的全部实力。

在这里我也分享一份大佬自己收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这些都是我闲暇还会反复翻阅的精品资料。在脑图中,每个知识点专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。

总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习

如果你有需要的话,可以扫描二维码
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值