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
}