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

Cmdlet开发中ThrowTerminatingError方法抛出未处理异常问题求助

问题原因

你遇到的问题根源在于使用async void修饰ProcessRecord方法。PowerShell的Cmdlet生命周期管理不兼容async void:异步方法抛出的异常会直接进入线程池的未处理异常流,无法被PowerShell的错误处理机制捕获,导致ThrowTerminatingError无法正常生成格式化错误,反而触发未处理的PipelineStoppedException。

解决方案

在PowerShell 7+中,Cmdlet原生支持异步处理,你需要重写ProcessRecordAsync方法(返回Task)替代async void的ProcessRecord:

protected override async Task ProcessRecordAsync(CancellationToken cancellationToken)
{
    try
    {
        var transferClient = new TransferClient(...);
        // 建议传递取消令牌,让PowerShell能正确响应管道终止操作
        var result = await transferClient.GetAsync(cancellationToken);
    }
    catch (AuthenticationException exception)
    {
        var record = new ErrorRecord(exception, "TestException", ErrorCategory.AuthenticationError, null);
        ThrowTerminatingError(record); // 现在会正常生成PowerShell格式化错误
    }
}
关键注意事项
  • 永远不要在Cmdlet的同步方法中使用async void,这会破坏PowerShell的错误处理管道。
  • 异步操作中尽量传递CancellationToken,确保PowerShell可以正确处理管道取消(比如用户按Ctrl+C)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:20:26