appendix:エラーのお話

文書の過去の版を表示しています。


オダメで出力されるエラーについてのお話。
エラーを見れるようになる必要はないですがエラーに含まれている情報でどこが重要なのかを知れば、他者に聞くときに渡すべき情報がどれかのの判断の一助になるかもしれません。

まず大きく2種類のパターンがあります。

  • 個々の処理がエラーを捕まえて自分でエラーメッセージを出しているもの。
  • 個々のエラー処理が例外を捕まえておらず、システム1)が出しているもの。

 前者の「個々の処理がエラーを捕まえて自分でエラーメッセージを出している」のほうは、どういった動作をするかはその「個々の処理」次第であるため非常に有意義な情報を出してくれる場合もあれば、まったくなにも出さなかったり誤った情報を出す場合などもあります。

 後者のシステムが出すものは、決まった内容を出してきます。

役に立つ情報を出している場合もあれば、そもそも何が出しているのかわからないものもあります。

正常に動作出来ない状況になった際に例外(Exception)が発生します。
これを捕まえ(catch)ずに放置すると見慣れたメッセージが出力されます。
こちらは決まったパターンで出力されます。

例えば最初の行
TypeLoadException: A type load exception has occurred.
「TypeLoadException」は例外の種類、続いてその説明「A type load exception has occurred.」。
次の「Stack trace:」の後にスタックトレースが続きます。

エラー(例外)の種類

何がまずかったのかを表しているためヒントになることが多いですが、よくある例外だと「まぁそうだろうね」ぐらいでしかない場合も。

よくある例外
  • NullReferenceException

 いわゆる「ぬるぽ」本来あるべきもの、本来取得できるものなどがない状態でそれを操作した場合など。
 ほとんどの場合、操作することが問題ではなくあるべきものがない、取得できるはずのものが取得できてないないことが問題。
 直前にファイルが読めてないとか出ている場合はおそらくそれが原因。

  • FileNotFoundException

 名前通りでファイルが見つからない場合に発生する。
 ただしデータファイルに限らずDLLなどがない場合もこれになる場合があるので要注意。

  • MissingFieldException

 本来あるはずのものがない場合。2)
 非常によくあるのが“TBody.goSlot”がないといわれるもの、COM3D2とCOM3D2.5でこの部分の扱いが変わっており、COM3D2用のプラグインをCOM3D2.5に入れたりすると発生する。

  • TypeLoadException

 これもあるはずのものがない場合。3)
 これも同じで“Slot”がないよ!って言われるのはCOM3D2.5用プラグインをCOM3D2に入れた場合など。

スタックトレース

例外が発生した箇所までにどういった処理が呼び出されているかを示したもの。
最初の行(一番上の行)が最後に処理された箇所、つまり例外が発生した箇所です。
ただ、ここに問題があると言うわけではありません。
例えば渡されたメイドさんを××するという処理だとして、メイドさんが渡されなかった場合はここでメイドさんがいないんじゃぁ例外4)が発生しますが、その原因はメイドさんを渡さなかった直前の処理です。
その直前の処理もその前の処理が原因かもしれないのでどの処理が悪いかは単純に判断出来ません。
ただし、エラー発生に至るまでの処理がわかるので、その処理を行ったプラグインがぁゃιぃと言うような見当を付けることは出来ます。


1)
Unityとかmonoの例外処理機構
2)
ある型にあるべきフィールドがない場合。
3)
あるべき型がない場合。
4)
おそらくNullReferenceException、渡されていないことをチェックして自力で例外を起こしたならArgumentNullExceptionとか

コメント

コメントを入力:
 
  • appendix/エラーのお話.1730436649.txt.gz
  • 最終更新: 2024/11/01 13:50
  • by fumble