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
相关产品推荐
相关产品推荐

