当前位置: 首页 > news >正文

网站轮播图居中代码怎么写工作室建设规划

网站轮播图居中代码怎么写,工作室建设规划,河南建设工程信息网招标公告,微网站对比一、核心思想:什么叫“异常封装”? 异常封装就是:捕获底层抛出的异常,然后转换成对当前调用者更有意义的、更高层的异常,再重新抛出。 这就像一个专业的翻译官或客服代表。 底层异常:是系统内部原始的、技术…

一、核心思想:什么叫“异常封装”?

异常封装就是:捕获底层抛出的异常,然后转换成对当前调用者更有意义的、更高层的异常,再重新抛出。

这就像一个专业的翻译官客服代表

  • 底层异常:是系统内部原始的、技术性的“黑话”(比如:SQLSyntaxErrorException, IOException: Broken pipe)。
  • 封装后的异常:是给你的程序其他部分或最终用户的、清晰的、业务相关的“人话”(比如:UserCreationFailedException("创建用户失败,请检查输入信息"))。

二、为什么需要它?(不封装会怎样?)

我们来看一个反面例子,感受一下不封装的痛苦。

场景:一个用户注册功能,需要将用户信息保存到数据库。

// 不推荐的做法:直接把底层异常抛给上层
public void registerUser(User user) throws SQLException {try {userDao.save(user); // 调用数据层方法} catch (SQLException e) {// 只是简单记录一下,然后又原样抛出去了logger.error("Save user failed", e);throw e; // 把SQLException原封不动地抛给上层(比如Controller)}
}

会发生什么?

  1. 泄露实现细节:当调用 registerUser 的方法(比如一个处理HTTP请求的Controller)捕获到 SQLException 时,它看到的是数据库层面的错误,可能是“主键冲突”、“字段超长”等。这暴露了你用了数据库、甚至表结构的设计,这是严重的安全和架构隐患

  2. 上层难以处理:Controller 拿到一个 SQLException,它该怎么处理?它需要去解析这个SQL错误码吗?这强迫上层去了解下层的实现细节,违反了设计原则。如果明天你把数据库换成NoSQL,所有上层处理异常的逻辑都要重写!

  3. 用户体验极差:最致命的是,如果你把 SQLException 的错误信息直接显示给用户,用户会看到一堆天书:

    Error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'zhangsan' for key 'username'

    用户完全不知道发生了什么,体验非常糟糕。


三、如何实践?(“翻译官”是怎么工作的)

法宝一:🔒 封装技术异常为业务异常

这是最核心、最常见的用法。将底层的、技术的异常(如JDBC、IO、网络异常)包装成你的应用领域内的业务异常。

改良后的注册例子:

// 首先,定义一个业务异常
public class BusinessException extends RuntimeException {public BusinessException(String message) {super(message);}// 通常也会保留原始异常,非常重要!public BusinessException(String message, Throwable cause) {super(message, cause);}
}public void registerUser(User user) {try {userDao.save(user);} catch (SQLException e) {// 1. 记录原始异常,方便开发者排查问题logger.error("数据库保存用户失败", e);// 2. 分析原因,翻译成业务语言if (e.getErrorCode() == 1062) { // MySQL duplicate key error// 封装!抛出业务异常throw new BusinessException("用户名已被注册,请更换", e);} else if (e.getErrorCode() == 1406) { // Data too longthrow new BusinessException("输入信息过长", e);} else {// 其他未知数据库错误,封装成通用业务异常throw new BusinessException("系统繁忙,请稍后再试", e);}}
}

这样做的好处:

  • 安全:Controller 层现在只会收到 BusinessException,里面是友好的提示信息“用户名已被注册”,而不是数据库细节。
  • 解耦:Controller 只需要关心业务异常,完全不知道底层是SQLite、MySQL还是MongoDB。底层实现的变更不会影响上层逻辑
  • 用户体验好:可以直接将 BusinessException 的消息安全地展示给用户。

法宝二:🧩 聚合多个异常为单一逻辑异常

有时一个操作会触发多个步骤,每个步骤都可能失败。我们可以封装一个代表整个操作失败的异常。

打比方:就像一个项目经理,他不需要向老板汇报每个程序员具体遇到了什么编译错误、测试哪个用例没过。他只需要汇总说:“老板,项目因技术难题要延期一周”。

例子:一个批量处理文件的任务。

public void processBatchFiles(List<File> files) {List<Exception> errors = new ArrayList<>();for (File file : files) {try {processSingleFile(file);} catch (ProcessingException e) {errors.add(e); // 收集单个文件的处理异常,不立即失败}}// 如果整个批量处理中有任何错误,就抛出一个汇总的异常if (!errors.isEmpty()) {throw new BatchProcessException("批量处理完成,但部分文件失败", errors);}
}

法宝三:🎯 简化复杂的异常体系

如果一个底层库抛出了几十种非常细化的异常,而你上层并不想处理每一种,可以封装成一个统一的、更通用的异常类型,减少上层需要关心的异常种类。

// 底层网络库可能抛出:ConnectionTimeoutException, UnknownHostException, SSLHandshakeException...
public Data fetchDataFromNetwork(String url) {try {return networkClient.get(url);} catch (NetworkException e) { // 捕获所有类型的网络异常// 封装成一个更通用的“数据获取失败”异常throw new DataFetchingException("无法从网络获取数据: " + url, e);}
}

四、最重要的注意事项

一定要保留原始异常(Cause)!

// 正确做法:将原始异常e作为cause传入
throw new BusinessException("友好提示", e);// 错误做法:丢失了原始异常的根因
// throw new BusinessException("友好提示");

为什么?

  • 为了排查问题:当你在日志中看到 BusinessException 时,你能通过 getCause() 方法看到最底层抛出的那个 SQLException 及其完整的堆栈轨迹,这对于调试是无价之宝
  • 这就像医生看病,病人说“我肚子疼”(封装后的业务异常),但医生一定要通过各种检查找到根本原因是“阑尾炎”(原始异常),才能对症下药。

总结与实践建议

操作比喻做法
不封装把工程师的调试日志直接念给客户听直接抛出底层异常(如 SQLException
正确的封装专业的翻译官或客服throw new BusinessException("友好消息", originalException);
错误的封装把原始报告扔了,自己瞎编一个原因throw new BusinessException("友好消息"); (丢失了原始异常)

实践建议:

  1. 定义你自己的业务异常类:这是开始封装的第一步。
  2. 在架构层次上划定边界:通常在你的服务层(Service Layer) 进行异常封装是最佳位置。它作为协调者,负责将技术语言(DAO层异常)翻译成业务语言。
  3. 永远使用带 cause 参数的异常构造函数,保留原始异常。
  4. 在最终用户界面(如Web控制器),捕获你封装好的业务异常,将其中的友好消息返回给前端。而底层的原始异常只记录日志,绝不外传。

记住封装的核心目的:对用户友好,对开发者透明。 用户看到的是清晰易懂的提示,开发者看到的是完整的、便于调试的错误链。

http://www.dtcms.com/a/607256.html

相关文章:

  • 青岛市建设安全监督站网站外贸网站建设原则
  • 大作设计网站官网登录微赞直播平台
  • 宿州网站建设公司哪家好html电子商务网站模板下载
  • 做搜狗手机网站排名软2345官网
  • 烟台网站排名seowordpress主题字体
  • 深圳提供网站建设制作wordpress收费会员
  • [科普] 卫星共视授时原理
  • 个人建设网站流程图温州市微网站制作电话
  • 做直播小视频在线观看网站龙岩个人小程序开发
  • Spring Boot 从 2.7.x 升级到 3.3注意事项
  • YOLO11-MSAM:印尼传统蜡染图案智能识别系统实现
  • 台州千寻网站建设公司好看网电影网站模板免费下载
  • 百度收录什么网站吗网页设计ppt模板
  • Mac怎么搭建网站开发环境jsp网站开发制作
  • 珠海网站建设公司哪家好网站开发工具需求
  • IDA反编译成C语言 | 深入解析反编译技术与应用
  • 如何高效利用上下文信息生成文章
  • WIN11更新后任务栏软件点击黑屏闪退问题解决
  • 禁止 vscode 启动时自动打开辅助侧边栏
  • NGO-VMD北方苍鹰算法优化变分模态分解+皮尔逊系数+小波阈值降噪+信号重构,MATLAB代码
  • alt+f4的调试记录之WM_SYSCOMMAND消息的产生--windows消息机制
  • 北京建设工程质量协会网站门户网站 开发语言
  • 中国电信网站备案系统wordpress 文字框
  • 【AGI】AI Agent架构趋势及演进
  • 哈尔滨网站开发培训如何做视频会员网站
  • 网站原创文章制作网站要不要域名
  • BuildingAI需求文档PRD
  • 珠海专业的免费建站wordpress模板内容页哪个文件
  • 做翻页电子书的网站个人网站怎么盈利
  • 网络营销推广网站收录哪些长沙旅游攻略景点必去