トップ回答者
Try,Catch文によるエラー処理について

質問
-
new-itemコマンドでディレクトリを生成し、エラー内容によって処理を分岐させるのに、かっこよくTry Catch文を使いたいのですが、どうすれば良いのかがわかりません。
やりたいことは、ディレクトリを新規に生成するごとに何らかのエラーが発生した場合、そのエラー内容によって処理を分けたいということです。
今までは以下のようにやっていました。
if ( $Error[0].FullyQualifiedErrorId -match 'DirectoryExist.*' ){ write-output "同名のディレクトリが存在します" }
試してみた構文は以下の通りなのですが、[System.IO]の部分を本当はどう書けば良いのかがわかりません。実はそれ以外の部分も含めて誤っているでしょうか。
Try{ New-Item -path c:\tmp -name DirectoryName -type directory -erroraction stop } Catch [System.IO]{ write-output "同名のディレクトリが存在します" }
よろしくおねがいいたします。
回答
-
例外が catch されないのは、一番最初の質問にあったコードの try の中ではそもそも例外が発生してないからだと思いますが。以下の話と同じことではないのでしょうか?
PowerShellの例外処理について
https://social.technet.microsoft.com/Forums/ja-JP/6fa69292-7725-4108-abc0-8c87b3b95bd0/powershell?forum=powershellja
> new-itemコマンドでディレクトリを生成し、エラー内容によって処理を分岐させるのに、
> かっこよくTry Catch文を使いたいのですが、どうすれば良いのかがわかりません。一番最初の質問にあったコードの後者の方で、例え try の中で例外が発生するとしても、try - catch で処理するのは決してカッコよくはないです。前者の方がカッコイイと思います。
その理由は先のレスで紹介した記事をよく読んでください。
- 回答としてマーク Fuzitaman 2015年4月3日 2:08
すべての返信
-
PowerShell のことはよく分からないのにレスするのもなんですが・・・
以下の記事に書いてあるように「よほどのことがない限り、アプリケーションで try-catch を書いてはいけません。」というのは、.NET アプリだけでなく、PowerShell にも当てはまるのではないでしょうか?
.NETの例外処理 Part.1
http://blogs.msdn.com/b/nakama/archive/2008/12/29/net-part-1.aspxキャッチしても何ともできない例外をキャッチして、無かったことにしてしまっているプログラムを時々見ます。
System.IO.IOException にもいろいろあって、中にはキャッチしないで終了すべきものもあるかと思いますが。
PowerShell の場合は見当違いのレスだったらすみません。
-
[System.IO.IOException]と書き換えて実行してみたのですが、単独でNew-Itemを実行した時と変わらないエラーが出力され、catchしてくれていないようです。
試しにmove-itemコマンドで「存在しないファイルをmove」しようとしてみました。
ご教示頂いた"$Error[0].Exception.GetType().FullName"で確認したところ、この場合は
[System.Management.Automation.ItemNotFoundException] のようでしたので、そのようにコードを書き換え、待ち受けてみたのですが、やはり無視されている様子・・・・ちょっと、環境を変えるなりしてしばらく格闘してみます。
ありがとうございました。
- 編集済み Fuzitaman 2015年4月2日 11:56
-
例外が catch されないのは、一番最初の質問にあったコードの try の中ではそもそも例外が発生してないからだと思いますが。以下の話と同じことではないのでしょうか?
PowerShellの例外処理について
https://social.technet.microsoft.com/Forums/ja-JP/6fa69292-7725-4108-abc0-8c87b3b95bd0/powershell?forum=powershellja
> new-itemコマンドでディレクトリを生成し、エラー内容によって処理を分岐させるのに、
> かっこよくTry Catch文を使いたいのですが、どうすれば良いのかがわかりません。一番最初の質問にあったコードの後者の方で、例え try の中で例外が発生するとしても、try - catch で処理するのは決してカッコよくはないです。前者の方がカッコイイと思います。
その理由は先のレスで紹介した記事をよく読んでください。
- 回答としてマーク Fuzitaman 2015年4月3日 2:08