You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#类库WndProc触发的事件处理逻辑异常捕获方案咨询

问题背景

你正在开发的C#类库通过不可见Form捕获WndProc系统消息触发内部处理逻辑,处理过程包含文件IO等可能抛出异常的操作,最终通过公共属性、事件对外输出结果,但处理逻辑的触发源是系统消息而非调用方主动调用的方法。

核心问题说明

内部处理方法_messageForm_CMMStateChanged是async void类型的事件回调,触发源属于系统消息循环,和调用方初始化类库、订阅事件的代码不在同一个调用栈,异常默认会直接抛到应用程序全局同步上下文,WinForm场景下会触发Application.ThreadException全局异常,无法通过调用方初始化代码周围的try/catch直接捕获。

解决方案

第一步:类库侧改造

你需要在类库内部捕获处理逻辑的异常,通过专门的事件传递给调用方,这是最符合类库设计规范的实现方式:

  1. 首先在Calypso类中新增异常通知事件:
// 新增异常通知事件,参数为抛出的异常实例
public event EventHandler<Exception> ErrorOccurred;
  1. 把整个_messageForm_CMMStateChanged的业务逻辑包裹在try/catch中,捕获到异常后触发上述事件:
private async void _messageForm_CMMStateChanged(object sender, CmmStateChangedEventArgs e)
{
    try
    {
        // 此处保留你原有的所有处理逻辑
        var command = await _stateManager.GetCommandFileAsync(Configuration.CMMObserverFolderPath);
        var observer = await _stateManager.GetObserverFileAsync(Configuration.CMMObserverFolderPath);
        // ... 其余原有代码
    }
    catch (Exception ex)
    {
        // 通知调用方发生异常
        ErrorOccurred?.Invoke(this, ex);
        
        // 可选:如果调用方未订阅异常事件,可根据需求选择是否重抛异常到全局
        // 若重抛:if (ErrorOccurred == null) throw;
    }
}

第二步:调用方侧处理

调用方只需订阅新增的ErrorOccurred事件,即可捕获所有内部处理逻辑抛出的异常:

public MainForm()
{
    InitializeComponent();

    apiConfiguration = new ApiConfiguration();

    api = new Calypso()
        .Configure(apiConfiguration)
        .Initialize();

    // 订阅异常事件,处理所有内部抛出的异常
    api.ErrorOccurred += Api_ErrorOccurred;
    api.CmmStateChanged += Api_CmmStateChanged;
    api.MeasurementInfoChanged += Api_MeasurementInfoChanged;
    api.MeasurementPlanInfoChanged += Api_MeasurementPlanInfoChanged;
}

private void Api_ErrorOccurred(object sender, Exception e)
{
    // 此处按业务需求处理异常,比如记录日志、弹出错误提示等
    MessageBox.Show($"CMM处理发生错误:{e.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
注意事项
  • 不要尝试在调用方初始化类库的代码外层包裹try/catch捕获这类异常,异常触发时初始化逻辑早已执行完毕,不在同一个调用栈,无法捕获。
  • 不建议在类库内部直接吞掉异常不做任何通知,会导致调用方无法感知错误,排查问题难度极高。
  • 如果业务需要,你也可以自定义异常事件参数,除了异常实例之外额外携带当前的CMM状态、上下文信息,方便调用方定位问题。

内容的提问来源于stack exchange,提问作者rosi97

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:54:02