LoginSignup
0
0

More than 5 years have passed since last update.

bash-oo-frameworkで理不尽な例外が投げられる場合の対処

Last updated at Posted at 2018-11-08

bash-oo-frameworkとは

bash-oo-frameworkは、とてもすごいbash用のフレームワークです。

  • オブジェクト指向
  • ロギング
  • テストフレームワーク
  • 関数型 など様々な機能に対応しています。

英語読める方はこちら: niieani/bash-oo-framework
日本語版のREADMEを作成中ですので気になったらみてみてください Cj-bc/bash-oo-framework:feature/japanese-docs
ちなみに、高度なことをやっているだけあって、コードリーディングをするだけでもかなり為になります。
bash好きな人は是非。
vimwiki持ってる方は、こちらをwikiとして登録してもらえば、僕のコードリーディングをいくらか見ることができます。(気付きやら何やら少し書いてます。)参考になれば幸いです。

で、現在の問題点。

Qiita書く気が失せる前にパパッとやりたいので簡潔に行きます。
oo-framework知っている人を前提に話します(当たり前だけど)。

現在、classblibとそれを呼び出すmain関数があります。
blib側で例外を吐くので、それをmainで捕捉し処理する形で書いていました。
が、main自身が例外を吐く...(おそらくフレームワークのバグです。)
単純にtryCatchで囲むとstatus codeが取れなくなる。かといってtryCatch内はサブシェルになっているため、変数に格納することもできません。
どうしたものか...

現状の回答

若干トリッキーですが今回はこのような対策をとりました

function main() {
    # 省略
}

try {
  main $@
  e="$?" throw
} catch {
  exit ${__EXCEPTION__[1]}
}

つまり、 main関数の戻り値を捕捉し、それを例外として投げてexitに渡すということです。
こうすればmainが例外吐いても対処できますし、status code失うこともありません。
もっとスマートに書きたい(というかそもそもmainに例外を吐いて欲しくない)のですが現状はこれが精一杯かなと。
超雑ですがもしも誰かの役に立てれば幸いです。(そして同じ問題に直面した人、是非連絡ください...日本人のoo-framework使用者と繋がりたい...)

0
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
0
0