ThrowTerminatingError如何在C#中工作?

时间:2015-10-05 11:17:41

标签: c# powershell

我有以下用C#编写的cmdlet,它基本上只会抛出一个错误:

http://www.example.com/example.html

我假设(我可能错了),这在PowerShell中是等效的)

[Cmdlet("Use", "Dummy")]
public class UseDummyCmdlet :PSCmdlet
{
    protected override void ProcessRecord()
    {
        var errorRecord = new ErrorRecord(new Exception("Something Happened"), "SomethingHappened", ErrorCategory.CloseError, null);
        ThrowTerminatingError(errorRecord);
    }
}

PowerShell版本的行为符合预期:

Function Use-Dummy()
{
    [CmdletBinding()]
    Param()

    process 
    {
        $errorRecord = New-Object System.Management.Automation.ErrorRecord -ArgumentList (New-Object System.Exception), 'SomethingHappened', 'NotSpecified', $null
        $PSCmdlet.ThrowTerminatingError($errorRecord) 
    }
}

然而,C#版本崩溃了,其中包含以下信息:

Use-Dummy : Exception of type 'System.Exception' was thrown.
At line:1 char:10
+ use-dummy <<<< 
    + CategoryInfo          : NotSpecified: (:) [Use-Dummy], Exception
    + FullyQualifiedErrorId : SomethingHappened,Use-Dummy

我做错了什么?

2 个答案:

答案 0 :(得分:1)

可以证实,这是一个环境问题,而且是一个该死的奇怪的人。

基本上,如果您按照here说明操作,那么请调试任何二进制模块,如果您致电ThrowTerminatingError,它会与PipelineStoppedException崩溃。

现在我需要某种修复/解决方法。

编辑:找到修复程序,检查项目属性中的“启用本机代码调试”。

答案 1 :(得分:1)

只需将ThrowTerminateError(errorRecord)包装到try块中,如下所示。

[Cmdlet("Use", "Dummy")]
public class UseDummyCmdlet :PSCmdlet
{
    protected override void ProcessRecord()
    {
        var errorRecord = new ErrorRecord(new Exception("Something Happened"), "SomethingHappened", ErrorCategory.CloseError, null);
        try
        { 
             ThrowTerminatingError(errorRecord);
        }
        catch (PipelineStoppedException ex)
        {}
    }
}