本シリーズのトップページ |
---|
https://qiita.com/robozushi10/items/0b0605257ad39bc22895 |
はじめに
前項で、例外発生のコードを記したが、このとき例外発生元の関数情報などをハードコーディングしていた.
これを C言語の __FILE__
や __LINE__
のような感じで埋め込めるようにしてみる.
環境
Windows 10 Pro
PowerShell バージョン 6系
プログラムについて
処理概要
次の 1〜5 の処理をする
1. module.ps1 を作成して __FILE__ , __LINE__ , __PATH__ を実装する.
なお、__PATH__ は絶対パスを表示する機能を持つ.
2. 実処理をする sample.ps1 の中から 1 の module.ps1 をインクルードする.
3. sample.ps1 の中で __FUNC__ 相当(関数表示)を実装する.
4. sample.ps1 の中で __FILE__ , __LINE__ , __PATH__ を呼び出す
5. sample.ps1 を実行する.
module.ps1
# 本スクリプト置き場
$BATDIR = $PSScriptRoot
# デバッグログ設定 ... ここを切り替えると Write-Debug によるログが表示されなくなる
$DebugPreference = 'Continue'
# ファイル名を返す関数
function Get-ScriptBaseName { return (Split-Path $MyInvocation.ScriptName -Leaf) }
# ファイル絶対パスを返す関数
function Get-ScriptFullName { return $MyInvocation.ScriptName }
# 行番号を返す関数
function Get-ScriptLineNumber { return $MyInvocation.ScriptLineNumber }
# 関数を変数として扱うための定義
new-item alias:__FILE__ -value Get-ScriptBaseName | Out-Null
new-item alias:__PATH__ -value Get-ScriptFullName | Out-Null
new-item alias:__LINE__ -value Get-ScriptLineNumber | Out-Null
sample.ps1
下記は 前回のコードにデバッグログを埋め込んだものである.
# module.ps1 を読み込む
. .\module.ps1
function sub($workdir)
{
# デバッグログ
Write-Debug "[$(__FILE__):$(__LINE__):$($MyInvocation.MyCommand)]"
# 引数 $workdir で指示されたディレクトリが存在しなければエラー終了させる
if(!(Test-Path -Type Container $workdir))
{
# 例外ログを強化した
throw "<$workdir> was not found: no such directory [$(__PATH__):$(__LINE__):$($MyInvocation.MyCommand)]"
}
}
function main()
{
# デバッグログ
Write-Debug "[$(__FILE__):$(__LINE__):$($MyInvocation.MyCommand)]"
# 引数 workdir に ".\work" を指定して呼び出す
sub -workdir ".\work"
}
try
{
# デバッグログ
Write-Debug "[$(__FILE__):$(__LINE__):$($MyInvocation.MyCommand)]"
# main 関数を呼び出す
main
}
catch
{
Write-Host "異常発生: $($error[0])"
# ここに確実に終了させたい処理を書けば良い
}
実行結果
次のようにデバッグ情報がより詳細になった
DEBUG: [sample.ps1:23:a.ps1]
DEBUG: [sample.ps1:16:main]
DEBUG: [sample.ps1:5:sub]
異常発生: <.\work> was not found: no such directory [c:\work\sample.ps1:10:sub]