异常之道:探索Java异常处理与日志的黄金准则

简介: 异常之道:探索Java异常处理与日志的黄金准则

异常处理与日志规范

  1. 底层原始异常不要捕获直接向外抛出,一直往外抛出,直到 Service 或者 Controller;
  2. 自定义的 BusinessException 异常统一在 Controller 层进行汇总处理;
  3. 其他异常需要首先在 Service 层进行 error 级别日志记录,之后向外层抛出 BusinessException 并调用 setCause 设置造成原因(注意 Service 只能向外抛出 BusinessException,其他异常需要进行异常转换);
  4. Controller 层不要再向外抛出异常,需要在 Controller 层进行捕获操作
  • 如果返回的是 RespResult,在 catch 中返回 RespResult.fail
  • 如果返回的是页面,在 catch 中返回 "redirect:/500"
  • Controller 层捕获异常的时候不需要打印错误日志
  1. 系统只处理受检异常,运行时异常不要捕获也不要抛出,属于Bug,应当解决;
  2. 进行异常转换时都要进行 error 级别日志记录,并且调用 initCause 方法设置错误原因;
  3. Service 层向外抛出自定义的 BusinessException 异常,由调用此 Service 的 Controller 或者定时任务捕获处理;
  4. 抛出定义的 CdnHuaweiException 或 BusinessException 是可以使用链式调用的方式快捷打印日志,示例如下:
  • throw new CdnHuaweiException("XXXX发生错误!错误原因:{}", e.getMessage()).setCause(e).log();
  1. 其他特殊类(Bean、Component、Interceptor…)的异常处理和日志打印规则可自行处理;

程序示例

DomainConfigureApi.java

public static JSONObject getDomainConfigs(String domainName) throws CdnHuaweiException {
    try {
        Request request = HuaweiRequest.getRequest(CdnConst.GET_DOMAIN_CONFIGS.replace("{domain_name}", domainName), "GET");
        Response response = HuaweiRequest.doRequest(request);
        return HuaweiRequest.dealResponse(response);
    } catch (Exception e) {
        log.error("查询域名配置接口失败!错误原因:{}", e.getMessage());
        throw new CdnHuaweiException("查询域名配置接口失败!错误原因:{}", e.getMessage()).setCause(e);
        // 如果打印的日志和报错的信息一样,那么上面两行代码也可以使用下面代替
        // throw new CdnHuaweiException("查询域名配置接口失败!错误原因:{}", e.getMessage()).setCause(e).log();
    }
}

CdnDomainService.java

public JSONObject getDomainConfig(String domainName) throws BusinessException {
    JSONObject jsonObject = null;
    try {
        jsonObject = DomainConfigureApi.getDomainConfigs(domainName);
    } catch (CdnHuaweiException e) {
        log.error("获取域名的详细配置失败,域名:{}", domainName);
        throw new CdnHuaweiException("获取域名的详细配置失败!错误原因:{}", e.getMessage()).setCause(e);
    }
    JSONObject configs = jsonObject.getJSONObject("configs");
    // 解析主源站
    JSONArray sourcesArray = configs.getJSONArray("sources");
    for (int i = 0; i < sourcesArray.size(); i++) {
        JSONObject source = sourcesArray.getJSONObject(i);
        if (source.getInteger("priority") == SourcePriority.MAIN) {
            configs.put("main_source", source);
        }
        if (source.getInteger("priority") == SourcePriority.BACK) {
            configs.put("back_source", source);
        }
    }
    return configs;
}

DomainSettingsPageController.java

@GetMapping("/domain-setting-basic")
public String domainBasicSettings(Long id, Map<String, Object> map) {
    if (Assert.isEmpty(id)) {
        return "redirect:/400";
    }
    CdnDomainVo cdnDomainVo = cdnDomainService.getCdnDomainVoById(id);
    if (Assert.isEmpty(cdnDomainVo)) {
        return "redirect:/404";
    }
    // 获取域名的详细配置
    try {
        JSONObject domainConfig = cdnDomainService.getDomainConfig(cdnDomainVo.getDomainName());
        map.put("domainConfig", domainConfig);
    } catch (BusinessException e) {
        return "redirect:/500";
    }
    // 查询所有的业务类型
    List<CdnBusinessType> businessTypes = cdnBusinessTypeService.queryAll();
    // 查询所有的业务范围
    List<CdnServiceArea> serviceAreas = cdnServiceAreaService.queryAll();
    // 查询所有源站类型
    List<CdnOriginType> originTypes = cdnOriginTypeService.queryAll();
    map.put("businessTypes", businessTypes);
    map.put("serviceAreas", serviceAreas);
    map.put("originTypes", originTypes);
    map.put("domain", cdnDomainVo);
    return "admin/domain/domain-setting-basic";
}


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1天前
|
Java 程序员 数据库
|
1天前
|
安全 Java 网络安全
Java中的异常处理:理解、实践与最佳实践云端防御线:云计算环境下的网络安全与信息保护
【5月更文挑战第28天】 在编程中,异常是无法避免的一部分,特别是在Java这种静态类型语言中。本文将深入探讨Java中的异常处理机制,包括如何理解异常,如何在代码中实现异常处理,以及一些关于异常处理的最佳实践。我们将通过实例和代码片段来阐述这些概念,以帮助读者更好地理解和应用Java的异常处理。 【5月更文挑战第28天】 随着企业数字化转型的深入,云计算服务已成为支撑现代业务的关键基础设施。然而,云服务的广泛采用也带来了前所未有的安全挑战。本文深入探讨了在云计算环境中维护网络安全和信息保护的策略和技术,分析了云服务模型对安全措施的影响,并提出了综合的安全框架以应对不断演变的威胁。通过采用加
|
2天前
|
Java 程序员 数据库连接
|
2天前
|
Java 测试技术 持续交付
Java中的异常处理机制探索自动化测试在微服务架构中的实践与挑战
【5月更文挑战第27天】本文将深入探讨Java中的异常处理机制,包括异常的概念、分类以及如何使用try-catch-finally语句进行异常处理。文章还将介绍自定义异常的方法以及在实际开发中如何选择合适的异常处理策略。 【5月更文挑战第27天】 随着软件开发领域向微服务架构的转型,传统的软件测试方法面临诸多挑战。本文旨在探讨自动化测试在微服务环境下的应用实践及所面临的问题。我们将从微服务的特性出发,分析自动化测试的必要性,并深入讨论如何构建一个高效、鲁棒的自动化测试框架。文章还将介绍一系列创新的测试策略和工具选择,以及如何克服微服务带来的分布式复杂性。最后,通过案例研究,展示自动化测试在实
|
2天前
|
机器学习/深度学习 Java 程序员
Java中的异常处理机制及其应用深度学习在图像识别中的应用与挑战
【5月更文挑战第27天】本文将深入探讨Java中的异常处理机制,包括异常的概念、分类以及如何在代码中进行有效的异常处理。通过对try-catch-finally语句的分析,我们将了解如何在Java程序中捕获和处理异常,以及如何自定义异常类以满足特定需求。此外,我们还将讨论异常处理在软件开发过程中的重要性,以及如何在实际项目中运用异常处理机制提高代码的健壮性和可维护性。
|
2天前
|
存储 安全 Java
Java中的异常处理:从基础到高级网络安全与信息安全:防范漏洞与强化意识
【5月更文挑战第27天】本文主要探讨了Java中的异常处理机制,从基础的try-catch-finally结构,到高级的自定义异常和异常链。我们将深入理解异常的概念,学习如何有效地处理异常,以及如何使用异常来提高代码的可读性和可维护性。 【5月更文挑战第27天】随着信息技术的迅猛发展,网络已成为社会运行的重要基础。然而,伴随而来的网络安全威胁也日益增多,尤其是安全漏洞的出现和利用,严重威胁着个人、企业乃至国家的信息资产安全。本文旨在分享关于网络安全漏洞的识别与防护方法、加密技术的应用以及提升个人和企业的安全意识等方面的关键知识,以帮助读者构建更为坚固的网络安全防线。
|
2天前
|
Java 编译器
Java异常处理机制
Java异常处理机制
13 1
|
4天前
|
Java 编译器 API
Java中的异常处理:理解、实践与最佳实践
【5月更文挑战第25天】在编程中,错误和异常是难以避免的。对于Java来说,其异常处理机制提供了一种强大而灵活的方式来处理程序运行时的错误。本文将深入探讨Java的异常处理机制,包括如何理解异常,如何使用try-catch-finally语句进行异常处理,以及如何创建自定义异常。最后,我们还将讨论一些关于Java异常处理的最佳实践。
|
4天前
|
Java 数据库连接 开发者
Java中的异常处理:理论与实践
本文深入探讨了Java编程语言中的异常处理机制。首先,我们将解释什么是异常,以及为什么我们需要处理它们。然后,我们将详细介绍Java的异常处理机制,包括try-catch语句和finally语句的使用。最后,我们将通过实例来演示如何在Java程序中有效地处理异常。无论你是Java初学者还是有经验的开发者,这篇文章都将帮助你更好地理解和使用Java的异常处理。
|
5天前
|
Java 编译器 数据库连接
Java异常处理:深入解析与实践
Java异常处理:深入解析与实践
195 1