namespace SHH.CameraSdk; /// /// 视频 SDK 统一异常类 (V3.3.1 修复版) /// 核心职责: /// 1. 封装标准化错误码、厂商原始错误码、设备品牌信息 /// 2. 记录异常上下文快照,辅助故障定位与复盘 /// 协作关系: /// 1. 与 配合:实现厂商错误码→标准错误码的转换 /// 2. 与 配合:提供错误码输入,驱动故障自愈决策 /// public class CameraException : Exception { #region --- 核心异常属性 (Core Exception Properties) --- /// /// 归一化后的标准错误码 /// 业务用途:作为 RecoveryPolicy 的决策输入,屏蔽厂商差异 /// public CameraErrorCode ErrorCode { get; } /// /// 厂商原始错误码(如海康 NET_DVR_GetLastError、大华 SDK 原生错误码) /// 业务用途:厂商文档对照、深度问题排查 /// public int RawErrorCode { get; } /// /// 发生异常的设备品牌 /// 业务用途:区分不同厂商的错误码规则,辅助错误映射 /// public DeviceBrand Brand { get; } /// /// 异常发生时的上下文快照(只读集合,防止外部篡改) /// 存储内容:设备IP、通道号、操作参数、SDK句柄、时间戳等案发现场信息 /// 业务用途:故障复盘时还原现场,快速定位根因 /// public IReadOnlyDictionary Context { get; init; } = new Dictionary(); #endregion #region --- 构造函数 (Constructors) --- /// /// 初始化 CameraException 实例 /// /// 归一化标准错误码 /// 异常描述信息 /// 设备品牌 /// 厂商原始错误码(默认 0) /// 内部异常(默认 null) public CameraException( CameraErrorCode errorCode, string message, DeviceBrand brand, int rawErrorCode = 0, Exception? innerException = null) : base(message, innerException) { ErrorCode = errorCode; Brand = brand; RawErrorCode = rawErrorCode; // 初始化上下文字典为可写的 Dictionary,兼容 WithContext 方法 Context = new Dictionary(); } #endregion #region --- 工具方法 (Utility Methods) --- /// /// 链式添加上下文信息(Builder 模式) /// 业务用途:在抛出异常前,逐步追加案发现场信息 /// /// 上下文键(如 "DeviceIp", "ChannelIndex") /// 上下文值 /// 当前异常实例(支持链式调用) public CameraException WithContext(string key, object value) { // 强制转换为可写的 Dictionary,保证上下文可追加 if (Context is Dictionary contextDict) { contextDict[key] = value; } return this; } /// /// 重写 ToString 方法,输出标准化异常日志 /// 格式:[CameraError] Brand: {品牌} | Code: {标准码}({原始码}) | Message: {描述} | Context: {上下文} /// /// 格式化的异常字符串 public override string ToString() { var contextStr = Context.Count > 0 ? $" | Context: {string.Join(", ", Context.Select(kvp => $"{kvp.Key}={kvp.Value}"))}" : string.Empty; return $"[CameraError] Brand: {Brand} | Code: {ErrorCode}({RawErrorCode}) | Message: {Message}{contextStr}"; } #endregion }