当前位置: 首页 > 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.dtcms.com/a/273936.html

相关文章:

  • 使用gdal读取shp及filegdb文件
  • C/C++动态内存管理函数详解:malloc、calloc、realloc与free
  • Launcher3桌面页面布局结构
  • JavaScript加强篇——第四章 日期对象与DOM节点(基础)
  • 基于 HT 技术的智慧交通三维可视化技术架构与实践
  • 全球化 2.0 | 印尼金融科技公司通过云轴科技ZStack实现VMware替代
  • Spring的事务控制——学习历程
  • Kuberneres高级调度01
  • 如何使用Fail2Ban阻止SSH暴力破解
  • ICCV2025接收论文速览(1)
  • 导出word并且插入图片
  • 【C++ 深入解析 C++ 模板中的「依赖类型」】
  • 「Linux命令基础」Shell命令基础
  • PC网站和uniapp安卓APP、H5接入支付宝支付
  • 基于ASP.NET+SQL Server实现(Web)企业进销存管理系统
  • 《探索电脑麦克风声音采集多窗口实时可视化技术》
  • 【Springboot】Bean解释
  • Jenkins 自动触发执行的配置
  • Ntfs!NtfsCheckpointVolume函数中的Ntfs!LfsFlushLfcb函数对Lfcb->LogHeadBuffer进行了赋值--重要
  • 冒泡、选择、插入排序:三大基础排序算法深度解析(C语言实现)
  • 模型训练的常用方法及llama-factory支持的数据训练格式
  • [论文阅读] 人工智能 + 软件工程 | LLM辅助软件开发:需求如何转化为代码?
  • GPT和MBR分区
  • SLICEGPT: COMPRESS LARGE LANGUAGE MODELSBY DELETING ROWS AND COLUMNS
  • 匿名函数作递归函数引用
  • Immutable
  • MetaMask 连接其他网络,连接本地的 Anvil 区块链节点
  • 在Windows非Docker环境安装Redis的几种方法
  • pytest+yaml+allure接口自动化测试框架
  • 在 Postman 中高效生成随机环境变量的完整指南