なぜ 後ろにある その他の例外 処理が優先されてしまうのでしょうか?
以下の記事の「例外の種類を気にしながらキャッチする」によると
PowerShellで例外を捕まえられない - Qiita
PowerShellのErrorAction
をStop
にしてスクリプトを止めようとすると、System.Management.Automation.ActionPreferenceStopException
がスローされるという仕様らしい。
とのことです。
そのため、最初はProcessCommandException
に引っかからず、System.Exception
として処理されてしまったのではないかと思われます。
powershell
1# System.Management.Automation.ActionPreferenceStopException をキャッチする
2try
3{
4 Get-Process -Name "Nothing" -ErrorAction Stop
5}
6catch [System.Management.Automation.ActionPreferenceStopException]
7{
8 Write-Host "プロセス無い"
9}
10catch [System.Net.WebException],[System.Exception]
11{
12 Write-Host "その他の例外"
13}
14finally
15{
16 Write-Host "クリーンアップしています..."
17}
また質問にもありますが、「その他の例外」のSystem.Exception
を無くした場合も「"プロセス無い"」が表示されました。
あくまで推測ですが、実際に投げられた例外→その元となった例外→…というように段階を踏んでcatch節の内容をチェックしているのではないかと思われます。
powershell
1# System.Exception を対象から外す
2try
3{
4 Get-Process -Name "Nothing" -ErrorAction Stop
5}
6catch [Microsoft.PowerShell.Commands.ProcessCommandException]
7{
8 Write-Host "プロセス無い"
9}
10catch [System.Net.WebException]
11{
12 Write-Host "その他の例外"
13}
14finally
15{
16 Write-Host "クリーンアップしています..."
17}
ちゃんとヘルプを見ていませんが、catch (未指定)
がcatchの最低優先度となると思われます。
そのため、特に理由が無ければ、すべてのエラーを一段階目でキャッチしてしまうcatch [System.Exception]
は避け、その他の例外はcatch (未指定)
とした方が良いと思われます。
指定されていた例外は調べて内容はなんとなく分かったのですが なぜそれがその他の例外部分で わざわざ指定されていたのかが分からないので
本当に消してしまっていいのか分かりません。
あくまで例だと思われます。
ActionPreferenceStopExceptionを直接確認するのは難しそうです。
一応、以下のコードで投げられていることは確認できましたが……。
powershell
1Add-Type -TypeDefinition @'
2public class ExceptionSample
3{
4 public static void Execute(System.Management.Automation.ScriptBlock ScriptBlock)
5 {
6 ScriptBlock.Invoke();
7 }
8}
9'@
10
11[ExceptionSample]::Execute({
12 Get-Process -Name NoMean -ErrorAction Stop
13})
"1" 個の引数を指定して "Execute" を呼び出し中に例外が発生しました: "ユーザー設定変数 "ErrorActionPreference" または共通パラメーターが Stop に設定されているため、実行中のコマンドが停止しました。名前
"NoMean" のプロセスが見つかりません。プロセス名を確認し、コマンドレットを再度呼び出してください。"
発生場所 行:11 文字:1
+ [ExceptionSample]::Execute({
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ActionPreferenceStopException
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/11 01:50
2018/12/11 02:39
2018/12/11 14:13
2018/12/12 02:14