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月前
|
JSON 安全 API
openapi swagger skills
本技能专为生成、审查与优化OpenAPI/Swagger文档而设计,遵循API优先原则,支持OpenAPI 3.1(默认)、3.0.x及Swagger 2.0。涵盖路径设计、HTTP语义、参数/响应/安全定义、错误模型、分页、异步任务等18项规范,确保文档准确、一致、可读、工具友好,适用于设计评审、文档生成、契约对齐与测试等场景。(239字)
232 3
|
15天前
|
缓存 弹性计算 应用服务中间件
高端网站搭建:Nginx 反向代理与动静分离架构配置详解
在现代企业级 Web 架构中,Nginx 凭借其极低的内存消耗和超强的高并发处理能力,成为了不可或缺的流量网关。特别是在阿里云 ECS 实例搭配 Alibaba Cloud Linux 3 的环境下,Nginx 能够充分利用操作系统的网络栈优化,实现惊人的吞吐量。 本文将详细介绍如何配置 Nginx 的反向代理与动静分离,将静态资源请求与动态接口请求完美剥离,从而大幅提升网站的整体响应速度。
|
15天前
|
前端开发 机器人 API
用两行代码将 AgentRun 集成到你的应用
AgentRun支持OpenAI协议,改两行代码即可将Agent无缝接入现有应用,兼容Python/Node.js/Java等;同时提供SDK、UI嵌入、IM机器人、云事件触发五种集成方式,开箱即用全链路能力。
|
2月前
|
人工智能 安全 API
深度解析 Claude Code 在 Prompt / Context / Harness 的设计与实践
文章内容基于作者个人技术实践与独立思考,旨在分享经验,仅代表个人观点。
3484 75
深度解析 Claude Code 在 Prompt / Context / Harness 的设计与实践
|
15天前
|
人工智能 API iOS开发
最新版 Claude Code 快速上手指南(新手友好版)
2026年,AI编程工具已经全面进入终端原生、任务驱动、多模型兼容的新时代。Claude Code凭借轻量化、全平台通用、可直接操作文件与执行命令的特性,成为开发者日常效率提升的首选工具。它无需复杂IDE插件,不依赖图形界面,直接在终端运行,能自动规划任务、阅读代码、修改文件、执行脚本,真正融入开发流程。
1388 0
|
15天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全+三种模式+记忆体系+实战工作流完整手册
Claude Code 是当前最流行的终端级 AI 编程助手,能够直接在命令行中完成代码生成、项目理解、文件修改、命令执行、错误修复等全流程开发工作。它不依赖图形界面、不占用额外资源,却能深度理解项目结构,自动生成规范代码,大幅提升研发效率。
2618 3
|
15天前
|
Java 流计算
【App Service】kudu中日志文件夹(LogFiles)中的没有application日志的根本原因?
Azure App Service中,应用日志(Application Logging)默认关闭,故Kudu中看不到`/home/LogFiles/Application`日志。需在门户手动启用“Application Logging (Filesystem)”才可落盘,但该功能12小时后自动关闭,仅适用于临时调试。
116 3
|
15天前
|
人工智能 运维 供应链
AI转型真正掉队的,不是员工,而是组织
当众人聚焦“员工如何不被AI淘汰”,CXOU AI未来大会直指更深层问题:真正掉队的,是组织本身——僵化的结构、迟滞的决策、割裂的信息与流失的经验。2026年6月12日上海,聚焦组织变革而非技术工具,邀实践者共探AI时代真正的转型路径。
|
XML JSON API
如何从 Swagger 导出 API 文档
Swagger 使这项任务相对简单,允许开发者以各种格式(如 JSON 和 YAML)导出 API 文档。在这篇博文中,我们将详细探讨如何从 Swagger 导出 API 文档。
如何从 Swagger 导出 API 文档