JAVA异常处理

简介: 本方案提出两种服务层错误处理策略:方案一用JDK21密封接口统一返回Result类型,显式表达成功/失败语义;方案二保留异常但边界内安全封装,自动映射业务异常为HTTP响应。二者均提升API健壮性与可维护性。(239字)

方案 1:Service 返回 Result,而不是抛业务异常

JDK 21 很适合用 sealed interface 表达结果类型:

public sealed interface Result<T>
        permits Result.Success, Result.NotFound, Result.BadRequest, Result.Failed {
   

    record Success<T>(T data) implements Result<T> {
   }

    record NotFound<T>(String msg) implements Result<T> {
   }

    record BadRequest<T>(String msg) implements Result<T> {
   }

    record Failed<T>(String msg) implements Result<T> {
   }
}

public class Response<T> {
   
    private final int code;
    private final String msg;
    private final T data;

    public Response(int code, String msg, T data) {
   
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public static <T> Response<T> from(Result<T> result) {
   
        return switch (result) {
   
            case Result.Success<T> r ->
                    new Response<>(200, "success", r.data());

            case Result.NotFound<T> r ->
                    new Response<>(404, r.msg(), null);

            case Result.BadRequest<T> r ->
                    new Response<>(400, r.msg(), null);

            case Result.Failed<T> r ->
                    new Response<>(500, r.msg(), null);
        };
    }
}
public Result<Void> doService() {
   
    var entity = repository.findById(id);

    if (entity.isEmpty()) {
   
        return new Result.NotFound<>("resource not found");
    }

    // do something
    return new Result.Success<>(null);
}

public Response<Void> bar() {
   
    return Response.from(service.doService());
}

方案 2:保留异常,但在边界内吞掉“已知业务异常”

如果你们现在 service 已经大量抛 NotFoundException、BizException,短期可以先做一个 wrapper,但只处理业务异常:


@FunctionalInterface
public interface ThrowingSupplier<T> {
   
    T get() throws Exception;
}
public class Response<T> {
   
    private String msg;
    private int code;
    private T data;

    public Response(int code, String msg, T data) {
   
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public static <T> Response<T> ok(ThrowingSupplier<T> supplier) {
   
        try {
   
            T data = supplier.get();
            return new Response<>(200, "success", data);
        } catch (Exception e) {
   
            return handleException(e);
        }
    }

    private static <T> Response<T> handleException(Exception e) {
   
        return switch (e) {
   
            case NotFoundException ex ->
                    new Response<>(404, ex.getMessage(), null);

            case IllegalArgumentException ex ->
                    new Response<>(400, ex.getMessage(), null);

            case NullPointerException ex ->
                    new Response<>(500, "Null pointer error", null);

            default ->
                    new Response<>(500, "Internal server error", null);
        };
    }
}

controller:

public Response<Void> bar() {
   
    return Response.safe(() -> {
   
        service.doService();
    });
}
相关文章
|
1天前
|
安全 Java C++
【Java基础】集合框架: ConcurrentHashMap核心原理:JDK1.7 vs 1.8+ 区别、线程安全实现、分段锁 vs CAS+synchronized、扩容机制
ConcurrentHashMap是Java高并发场景下线程安全的哈希表实现,JDK1.7采用Segment分段锁(16段独立加锁),JDK1.8升级为CAS+synchronized细粒度桶锁,并引入红黑树与多线程协助扩容,显著提升性能与扩展性。
|
1天前
|
Java 流计算
【App Service】kudu中日志文件夹(LogFiles)中的没有application日志的根本原因?
Azure App Service中,应用日志(Application Logging)默认关闭,故Kudu中看不到`/home/LogFiles/Application`日志。需在门户手动启用“Application Logging (Filesystem)”才可落盘,但该功能12小时后自动关闭,仅适用于临时调试。
|
1天前
|
NoSQL Java 关系型数据库
吐血整理:2026大厂后端技术岗笔面试高频100题
本文揭秘2026大厂后端面试新趋势:题库未变,但考法剧变——从死记硬背转向考察源码理解、线上排障与设计权衡三大能力。通过真实案例对比与可落地的准备方法,帮你告别无效刷题,直击面试官真实意图。
|
1天前
|
存储 安全 Java
【Java基础】集合框架: HashMap核心原理:JDK1.7 vs 1.8+ 区别、数据结构、哈希函数、扩容机制、put/get全流程、红黑树转换阈值(附《思维导图》+《面试高频考点清单》)
本文系统对比JDK1.7与1.8+中HashMap的底层原理,涵盖数据结构(数组+链表→+红黑树)、哈希函数、扩容机制、插入方式及并发问题等核心差异,助你深入理解性能优化逻辑与面试高频考点。
|
1天前
|
消息中间件 负载均衡 算法
程序员必备的十大技能(进阶版)之分布式核心技术(一)
教程来源 http://unbgv.cn/ 本文系统剖析分布式核心技术,涵盖CAP/BASE理论、服务治理、一致性协议、分布式事务、锁、消息中间件、负载均衡、存储及可观测性九大维度,直击微服务演进中的核心挑战与落地实践。
|
1天前
|
缓存 监控 网络安全
这 5 种网站问题,90% 的开发者都遇到过
本文汇总网站五大高频痛点:海外访问慢、DDoS/CC攻击、CDN成本高、HTTPS配置难及监控缺失,并提供基于阿里云ESA的一站式解决方案——全球加速、智能防护、自动证书、成本优化与实时告警,基础版免费试用,省心省钱省时。
|
8天前
|
JSON 安全 API
openapi swagger skills
本技能专为生成、审查与优化OpenAPI/Swagger文档而设计,遵循API优先原则,支持OpenAPI 3.1(默认)、3.0.x及Swagger 2.0。涵盖路径设计、HTTP语义、参数/响应/安全定义、错误模型、分页、异步任务等18项规范,确保文档准确、一致、可读、工具友好,适用于设计评审、文档生成、契约对齐与测试等场景。(239字)
127 3
|
1天前
|
自然语言处理 运维 安全
基于伪造发票的 PayPal 钓鱼攻击机理与防御技术研究
本文剖析PayPal伪造发票钓鱼攻击——一种滥用官方邮件通道、融合社会工程学与技术欺骗的复合型欺诈。文章系统揭示其六阶段攻击链路,提出四维检测模型及可复现Python代码,并构建平台、技术、用户协同的三层闭环防御体系,助力支付机构与用户精准识别、有效防护。(239字)
24 0
|
1天前
|
存储 人工智能 安全
意图共鸣科技《AI记忆链商业化白皮书2.0》认知锚定:从“存算解耦”到“房电分离”,新概念的“翻译术”
本文提出“认知锚定”方法论:用大众熟悉的日常经验(如房电分离、银行保险箱)精准映射技术概念(如存算解耦、双轨制),降低理解门槛。它不是比喻,而是逻辑同构的思维桥梁,旨在构建行业共识话语体系,让技术真正被听懂、信任并落地。
30 0
|
1天前
|
运维 Serverless API
PHP在无服务器架构(Serverless)中的运用与实践
无服务器架构(Serverless)指开发者编写函数部署到云平台(AWSLambda、GoogleCloudFunctions、阿里云函数计算),平台自动伸缩、按调用计费
26 0