VB.NETで書かれてるサーバアプリケーションが、なんだかうまく動かない。ログを出してみればこんな感じのスタックトレースが出てた。
[例外の型とかメッセージとか]
YYY..ctro()
XXX.Main()
VB.NETでもスタックトレースはつらつらと出ます。んで普通は "クラス名.メソッド名" になるんだけど、今回は "クラス名..ctor()" とかなってる。ctorなんてメソッドは作ってないし、なんか "." が多い。これなんだろうかと思ったけど、どうもコンストラクタのようです。VB.NETのコンストラクタは通常以下のような感じで書くので、思考からはずしちゃってました。
Sub New() 'なんかやる End Sub
内部で ".ctor()" に置き換えられるのか、初期化ブロックみたいなのにそんな名前がついているのかはよく知りません。けど例外が出るのはインスタンス生成時です。とりあえず今回はクラスメンバの初期化に失敗していた模様。簡単に書くとこんな感じの場合に出ます。
Module XXX Public Sub Main() '(略) 'この行で落ちる Dim y As New YYY() '(略) End Sub End Module Class YYY '何か落ちる処理で初期化する Private x As ZZZ = wrong() '(略) End Class
対処は落ちないように初期化するとか、初期化を諦めるとか、コンストラクタで初期化するように書いていれば、もう少しまともなログが出るのかもしれません。とりあえず "クラス名..ctor()" なんてのが出たらフィールド疑ってみるのもありかも。
"メソッド"だとか"フィールド"だとか言っても通じない事があるので、VBな事を喋る時は"メソッド"は"ファンクション"か"サブ"*1、"フィールド"は"変数"とか置き換えます。呼び方ややこしいよ。
*1:不思議な事に"プロシージャ"って言うとこれまた通じない