none
Try,Catch文によるエラー処理について RRS feed

  • 質問

  • 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 "同名のディレクトリが存在します"
    }

    よろしくおねがいいたします。

    2015年4月2日 8:34

回答

  • 例外が 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
    2015年4月3日 0:39

すべての返信

  • [System.IO.IOException] でしょうか。

    ちなみにこの例外クラス名は、$Error[0].Exception.GetType().FullNameとすることで調べました。

    • 回答としてマーク Fuzitaman 2015年4月3日 2:07
    • 回答としてマークされていない Fuzitaman 2015年4月3日 2:07
    2015年4月2日 9:37
    モデレータ
  • 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 の場合は見当違いのレスだったらすみません。

    2015年4月2日 9:58
  • [System.IO.IOException]と書き換えて実行してみたのですが、単独でNew-Itemを実行した時と変わらないエラーが出力され、catchしてくれていないようです。

    試しにmove-itemコマンドで「存在しないファイルをmove」しようとしてみました。

    ご教示頂いた"$Error[0].Exception.GetType().FullName"で確認したところ、この場合は

    [System.Management.Automation.ItemNotFoundException] のようでしたので、そのようにコードを書き換え、待ち受けてみたのですが、やはり無視されている様子・・・・ちょっと、環境を変えるなりしてしばらく格闘してみます。

    ありがとうございました。


    • 編集済み Fuzitaman 2015年4月2日 11:56
    2015年4月2日 11:54
  • >System.IO.IOException にもいろいろあって、中にはキャッチしないで終了すべきものもあるかと思いますが。

    ディレクトリの生成以外で、どんな処理だったらSystem.IO.IOExceptionで引っかかってくるのか、ちょっと、いろいろ試してみます。ありがとうございます。



    • 編集済み Fuzitaman 2015年4月2日 11:59
    2015年4月2日 11:59
  • 例外が 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
    2015年4月3日 0:39
  • よく、わかりました。new-itemなどは誰でもよく使う一般的なコマンドで、ファイルが既にある、などといった十分想定しうる事態で、かつユーザにも対処のしようがある場合は無理に使う必要がない・使ってはならない、という理解で今後考えていきます。

    今回の事は、例外でも何でも無いという理解で、普通にif文で対処します。ありがとうございました。

    2015年4月3日 2:07