2011-07-13 53 views
7

Start-Serviceによってスローされた例外をキャッチできないようです。ここに私のコードは次のとおりです。Powershell:サービスを開始できないときに例外をスローします。

try 
{ 
    start-service "SomeUnStartableService" 
} 
catch [Microsoft.PowerShell.Commands.ServiceCommandException] 
{ 
    write-host "got here" 
} 

私はこれを実行すると、例外がスローされますが捕捉されない:

*Service 'SomeUnStartableService' start failed. 
At line:3 char:18 
+  start-service <<<< "SomeUnStartableService" 
    + CategoryInfo   : OpenError: (System.ServiceProcess.ServiceController:ServiceController) [Start-Service], ServiceCommandException 
    + FullyQualifiedErrorId : StartServiceFailed,Microsoft.PowerShell.Commands.StartServiceCommand* 

$ErrorActionPreference停止するように設定されているので、これは問題になることはありません。

コードをcatch [Exception]に変更すると、例外がキャッチされ、「ここにあります」が印刷されます。

start-serviceServiceCommandExceptionなどを投げますか?それはあるかのように見えますが、私はそれをキャッチすることはできません!

---編集---

start-serviceが例外をスローし、唯一start-serviceによってスローされた例外をキャッチしていない場合には理想的には、私は次のように書くと、例外をスローする可能性:

try 
{ 
    start-service "SomeUnStartableService" 
    throw (new-object Exception("service started when expected not to start")) 
} 
catch [Microsoft.PowerShell.Commands.ServiceCommandException] 
{ 
    write-host "got here" 
} 

答えて

1

I通常、ドンとバイパスのようなものがありますキャッチフラを制限しないキャッチブロック内の論理テストで例外を処理します。

try 
{ 
    start-service "SomeUnStartableService" -ea Stop 
} 
catch 
{ 
    if ($error[0].Exception -match "Microsoft.PowerShell.Commands.ServiceCommandException") 
    { 
     #do this 
    } 
    else 
    { 
     #do that 
    } 
} 

おそらくクリーンではない可能性があり、巨大なキャッチブロックになる可能性があります。しかし、それが動作すれば...;)

+0

特定の例外を捕まえているのと同じくらい綺麗ではないのは残念ですが、これができないのであれば、次善のことだと思います。 – Jack

10

Try/Catchは、終了するエラーに対してのみ機能します。エラーに終了エラーをするためにストップの値でerrorActionというパラメータを使用して、あなたはそれをキャッチできるようになります:

try 
{ 
    start-service "SomeUnStartableService" -ErrorAction Stop 
} 
catch 
{ 
    write-host "got here" 
} 

はUPDATE:

あなたが「STOP」に$ ErrorActionPreferenceを設定した場合(または-ErrorAction Stopを使用します)、エラータイプはActionPreferenceStopExceptionであるため、エラーをキャッチするために使用できます。

+0

$ ErrorActionPreferenceが停止するように設定されていれば十分ではありませんか? – JPBlanc

+0

$ ErrorActionPreferenceが 'Stop'に設定されているため、-erroraction Stopを追加しても違いはありません。上記のコードは一般的な[例外]をキャッチしますが、start-serviceによってスローされた例外のみを捕捉したい、つまりtryブロックに別の例外をスローすることはできますが、 – Jack

+0

申し訳ありませんが、その部分を逃しました。私はスレッドを更新して、それをチェックアウトしました。 –

0

あなたが使用することができ、あなたの例外を発見する

$ErrorActionPreference='stop' 

try 
{ 
    start-service SomeUnStartableService 
} 
catch [System.Management.Automation.ActionPreferenceStopException] 
{ 
    write-host "got here" 
} 

}:

try 
{ 
    start-service "SomeUnStartableService" -ea Stop 
} 
catch 
{ 
$_.exception.gettype().fullname 
} 

編集:ここではSystemException

try 
{ 
    start-service "SomeUnStartableService" -ea Stop 
} 
catch [SystemException] 
{ 
write-host "got here" 
} 
+0

これは、上記で捕捉しようとしていたMicrosoft.PowerShell.Commands.ServiceCommandExceptionを返します。 – Jack

+0

編集は助けになりますので、私はそれを投票したので目的に合っていると思いますが、少しの回避策として答えが出るとは思えません。 – Jack

関連する問題