日々常々

ふつうのプログラマがあたりまえにしたいこと。

.ctor(どっとしーてぃーおーあーる)の例外

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:不思議な事に"プロシージャ"って言うとこれまた通じない