パースエラー

今日は全然縮まなかったので、以前デバッグ中に見つけたクラッシュするパターンを調査しました。
原因はデバッガで覗くとすぐに判明。include文で読み込んだjamファイルのパースが成功したかどうかチェックしていないだけでした。
とりあえず適当な例外を投げておきました。
差分
パース時にエラーの位置まで分かるので、それを例外オブジェクトに持たせるべきですね。


ここに限らず、エラーが発生したらファイルの位置やスタックトレースを表示しないといけないのですが、例外を受け取る頃にはbjam2::contextのスタック情報はアンワインドされてしまうので、スタック情報は例外オブジェクトの方にコピーしておかないとダメです。
この方法はあらゆる例外に対して行えるわけでもないので、例外発生時はbjamのスタックをそのまま残しておく方が便利かもしれません。


とはいえ、std::uncaught_exception()では元々未捕捉例外があったのか、今の処理で発生したのか区別が付かないので、スタックを残しておくのも難しいです。
エラー処理用にコールバック関数か何かを用意するのが賢明ですかねぇ。