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();
    });
}
相关文章
|
2月前
|
JSON 安全 API
openapi swagger skills
本技能专为生成、审查与优化OpenAPI/Swagger文档而设计,遵循API优先原则,支持OpenAPI 3.1(默认)、3.0.x及Swagger 2.0。涵盖路径设计、HTTP语义、参数/响应/安全定义、错误模型、分页、异步任务等18项规范,确保文档准确、一致、可读、工具友好,适用于设计评审、文档生成、契约对齐与测试等场景。(239字)
283 3
|
3月前
|
人工智能 安全 API
深度解析 Claude Code 在 Prompt / Context / Harness 的设计与实践
文章内容基于作者个人技术实践与独立思考,旨在分享经验,仅代表个人观点。
3793 75
深度解析 Claude Code 在 Prompt / Context / Harness 的设计与实践
|
1月前
|
缓存 弹性计算 应用服务中间件
高端网站搭建:Nginx 反向代理与动静分离架构配置详解
在现代企业级 Web 架构中,Nginx 凭借其极低的内存消耗和超强的高并发处理能力,成为了不可或缺的流量网关。特别是在阿里云 ECS 实例搭配 Alibaba Cloud Linux 3 的环境下,Nginx 能够充分利用操作系统的网络栈优化,实现惊人的吞吐量。 本文将详细介绍如何配置 Nginx 的反向代理与动静分离,将静态资源请求与动态接口请求完美剥离,从而大幅提升网站的整体响应速度。
|
Prometheus 监控 Cloud Native
【监控利器Prometheus】——Prometheus+Grafana监控SpringBoot项目JVM信息
Prometheus+Grafana监控SpringBoot项目JVM信息 1. SpringBoot项目配置JVM采集 2. Prometheus配置 3. 配置grafana 4. 扩展-通过JMX Exporter监控JVM信息
【监控利器Prometheus】——Prometheus+Grafana监控SpringBoot项目JVM信息
|
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
【Java基础】集合框架: HashMap核心原理:JDK1.7 vs 1.8+ 区别、数据结构、哈希函数、扩容机制、put/get全流程、红黑树转换阈值(附《思维导图》+《面试高频考点清单》)
本文系统对比JDK1.7与1.8+中HashMap的底层原理,涵盖数据结构(数组+链表→+红黑树)、哈希函数、扩容机制、插入方式及并发问题等核心差异,助你深入理解性能优化逻辑与面试高频考点。
|
1月前
|
人工智能 自然语言处理 数据可视化
企业如何应用智能客服?瓴羊Quick Service用好智能客服系统落地应用策略
本文剖析智能客服“上线即吃灰”困局,提出瓴羊Quick Service四大落地策略:结构化知识构建、人机协同坐席辅助、数据驱动效果评估、组织保障运营机制,助力企业从“可用”迈向“好用”,实现服务数智化升级。(239字)
|
1月前
|
NoSQL Java 关系型数据库
吐血整理:2026大厂后端技术岗笔面试高频100题
本文揭秘2026大厂后端面试新趋势:题库未变,但考法剧变——从死记硬背转向考察源码理解、线上排障与设计权衡三大能力。通过真实案例对比与可落地的准备方法,帮你告别无效刷题,直击面试官真实意图。
|
1月前
|
SQL 人工智能 自然语言处理
准确率 100% 的智能问数(Text2SQL)实践,还要关心什么指标?
润乾NLQ创新采用“规范文本+规则编译”架构,将口语转为可验证的中间语言,再确定性生成SQL,实现规范文本→SQL环节100%准确率。规避大模型幻觉,支持多表JOIN、子查询、聚合等复杂场景,实施门槛低、结果稳定可控。(239字)