LoginSignup
1
0

More than 1 year has passed since last update.

[04] PowerShell実践例 ... エラー終了させたい場合は素直に例外を使う

Last updated at Posted at 2021-07-25
本シリーズのトップページ
https://qiita.com/robozushi10/items/0b0605257ad39bc22895

はじめに

PowerShell の戻り値の扱いは難しく、個人的にはあまり使わない方が良いと思っている.
特に、呼び出し元にエラー値を返す場合などは難しい. (正直なところ至難である)

それでもエラー分岐に進んでしまった場合に、呼び出し元へエラー値を返して、適切な後始末をしてから終了させないといけない場合もある.

例: シリアルポートのクローズや、USBメモリなどのアンマウントなど

このような場合、try 〜 catch による例外捕捉の準備をしたうえで、エラーシーケンスに進んだ際に throw を実行する方が楽で且つ確実であった.
さらに throw の際にエラーログを埋め込んでおくとデバッグも捗った.

これらは Python における自作 Exception に該当する.

このときの対応例を記しておく.

 

環境

Windows 10 Pro
PowerShell バージョン 6系

プログラムについて

処理概要

次の 1〜5 の処理をする

1. 例外捕捉の準備をする
2. main 関数を呼び出す
3. main 関数から sub 関数を呼び出す
4. sub 関数の中でエラー分岐に進み、例外を発生させる.
5. main 関数の呼び出し元で例外をキャッチして各種後始末をする.

sample.ps1

function sub($workdir)
{
  # 引数 $workdir で指示されたディレクトリが存在しなければエラー終了させる
  if(!(Test-Path -Type Container $workdir))
  {
     # 🛑終了させたい場合は下手に戻り値を返さずに例外を発生させてしまう.
     # このときデバッグ情報を書いておくと便利である.
     throw "<$workdir> was not found: no such directory [at sub]"
  }
}

function main()
{
  # 引数 workdir に ".\work" を指定して呼び出す
  sub -workdir ".\work"  
}

# 以下、実処理開始

try
{
  # 例外捕捉の準備をしてから main 関数を呼び出す
  main
}
catch
{
  # 上記 🛑 で発生した例外を捕捉できる
  Write-Host "異常発生: $($error[0])"
  # ここに確実に終了させたい処理を書けば良い
}


実行結果

次のようにデバッグ情報と共に終了させることができる.

異常発生: <.\work> was not found: no such directory [at sub]
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0