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

4.丢出异常捕捉异常TryCatch C#例子

在仪器控制或硬件通信场景中,底层驱动抛出的异常往往晦涩难懂,如果直接弹窗给用户,既暴露实现细节,也难以定位问题。本文通过两段式异常处理策略,演示如何把“底层原始错误”转化为“上层可操作建议”。


一、需求场景

  1. 场景 A:参数设置不当 → 设备返回“带宽超限”。
    允许降级到 CW 模式继续工作,并给用户清晰提示。

  2. 场景 B:初始化失败 → 设备返回“致命错误”。
    必须立即重置会话,阻断后续流程,并记录日志。


二、两段式异常处理模型

底层(Driver)——抛异常↓
中层(API)——捕获 → 分类 → 二次抛/降级↓
上层(UI)——统一弹窗/日志
  • 底层:只抛不处理,保持纯净。

  • 中层:根据 ErrorCode/Message 判断严重程度,决定“降级”或“重新抛”。

  • 上层:只做展示,不处理业务。


三、代码实战

1. 中层 API —— 降级处理(场景 A)

使用ex.Message只会把异常文本抛给用户,不会附带线程信息

public void SwitchToARB()
{try{session.SetARB();          // 可能抛 “Bandwidth exceeded”}catch (Exception ex){// 降级:带宽超限 → 回退到 CWOpenCW();                  // 打开连续波throw new UserFriendlyException("带宽超限,已自动回退到 CW 模式", ex.Message);}
}

UI 层捕获:

private void Button_ARB_Click(object sender, RoutedEventArgs e)
{try{arbGenerator.SwitchToARB();}catch (UserFriendlyException uex){MessageBox.Show(uex.Message);}
}

2. 中层 API —— 致命错误重置(场景 B)

public void Generation()
{try{session.Initiate();        // 可能抛 “Hardware fatal”}catch (Exception ex){// 致命错误:立即清理资源,防止句柄泄露Close();throw new SessionFatalException("设备初始化失败,会话已重置", ex.Message);}
}

UI 层捕获:

try
{signalGen.Generation();
}
catch (SessionFatalException fex)
{MessageBox.Show(fex.Message, "错误", MessageBoxButton.OK, MessageBoxImage.Error);return;;   // 退出
}


五、小结

层级职责关键动作
Driver抛原始异常不处理
API分类 + 决策降级 or 重抛
UI展示 + 日志不处理业务

两段式异常处理让“错误”从“灾难”变成“信息”,既保证程序健壮,又提升用户体验。下次遇到底层错误,先想想属于哪一级,再决定是“回退”还是“熔断”。

http://www.lryc.cn/news/584980.html

相关文章:

  • USB数据丢包真相:为什么log打印会导致高频USB数据丢包?
  • mysql数据库导入导出命令
  • 【Linux-云原生-笔记】系统引导修复(grub、bios、内核、系统初始化等)
  • Grok-4 发布会图文总结
  • 苹果UI 设计
  • SLICEGPT: COMPRESS LARGE LANGUAGE MODELSBY DELETING ROWS AND COLUMNS
  • Deepseek-如何从零开始开发需要专业知识的prompt
  • 8155平台SPI学习笔记
  • 从零实现一个GPT 【React + Express】--- 【4】实现文生图的功能
  • 深入剖析Spring Bean生命周期:从诞生到消亡的全过程
  • 英文国际期刊推荐:MEDS Chinese Medicine,中医药方向可发
  • 47-RK3588 用瑞芯微官方提供recovery进行OTA升级
  • Auto-GPT 简易教程
  • 前端抓包(不启动前端项目就能进行后端调试)--whistle
  • UI前端与数字孪生融合新领域:智慧环保的垃圾分类与回收系统
  • Windos服务器升级MySQL版本
  • 中国银联豪掷1亿采购海光C86架构服务器
  • 如何查看自己本地的公网IP地址?内网环境网络如何开通服务器公网ip提供互联网访问?
  • 电力分析仪的“双语对话”:CCLinkIE与Modbus TCP的无缝连接
  • 从《哪吒 2》看个人IP的破局之道|创客匠人
  • 【实用IP查询工具】IP数据云-IP地址查询离线库使用方案
  • 服务器机柜与网络机柜各自的优势
  • 解决Linux绑定失败地址已使用(端口被占用)的问题
  • python的卷烟营销数据统计分析系统
  • AIStarter新版重磅来袭!永久订阅限时福利抢先看
  • Spring Cloud Gateway介绍 - -基础概念,简单工作原理和配置示例
  • Element Plus和Ant Design Vue深度对比分析与选型指南
  • 飞算 JavaAI:开启 Java 开发新时代
  • C++——构造函数的补充:初始化列表
  • TypeScript---泛型