質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

1回答

8723閲覧

catch でハンドリングする例外処理を 指定の例外と それ以外で分けたい 、一応 出来て 正常に動作しているように見えるが それでいいのか分かりません。

kamikazelight

総合スコア305

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2018/12/10 04:56

前提・実現したいこと

catch でハンドリングする例外処理を 指定の例外と それ以外で分けたいのです。
試にGet-Processで存在しない名前を指定してエラーを出した後に
$Error[-1].Exception.GetBaseException().gettype().fullnameで例外を確認して

スニペットのtry-catch-finally の [DivideByZeroException]部分をそれに置き換えてみたのですが
その他の例外 の方が優先されてしまいます。
その他の例外の [System.Net.WebException],[System.Exception]を消してcatchだけにすると
正常に動作しているように見えるのですが
それで問題ないのでしょうか?

指定されていた例外は調べて内容はなんとなく分かったのですが なぜそれがその他の例外部分で わざわざ指定されていたのかが分からないので
本当に消してしまっていいのか分かりません。

又、なぜ 後ろにある その他の例外 処理が優先されてしまうのでしょうか?

教えて頂きたいです。
お願い致します。

該当のソースコード

powershell

1Using Namespace Microsoft.PowerShell.Commands 2try 3{ 4 Get-Process -Name "Nothing" 5} 6catch [ProcessCommandException] 7{ 8 Write-Host "プロセス無い" 9} 10catch [System.Net.WebException],[System.Exception] 11{ 12 Write-Host "その他の例外" 13} 14finally 15{ 16 Write-Host "クリーンアップしています..." 17}

補足情報(FW/ツールのバージョンなど)

Win10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

なぜ 後ろにある その他の例外 処理が優先されてしまうのでしょうか?

以下の記事の「例外の種類を気にしながらキャッチする」によると

PowerShellで例外を捕まえられない - Qiita

PowerShellのErrorActionStopにしてスクリプトを止めようとすると、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/10 11:24

編集2018/12/11 14:10
imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamikazelight

2018/12/11 01:50

catchのことをSwitchと同じようにとらえていたので段階を踏んでるとは思いませんでした。 分かりやすい回答ありがとうございました。
kamikazelight

2018/12/11 02:39

すみません。 実際に投げられた例外は$Error等から確認、取得する方法はあるのでしょうか? 探してみたのですが見つけられませんでした... こちらは別の質問にしたほうがいいでしょうか?
imihito

2018/12/11 14:13

> catchのことをSwitchと同じようにとらえていたので段階を踏んでるとは思いませんでした。 私もそう思っていたので、今回は驚きでした。 私の回答内容は、公式の裏付けを取っていないので参考程度としておいてください。
kamikazelight

2018/12/12 02:14

分かりました。 今回もありがとうございました。 またよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問