2012-01-25 10 views
1

1人のユーザーがこの例外を報告しています。私の研究では、これは静的なコンストラクタエラーであることを示唆しています。関連するクラスには、初期化される多くの静的フィールドが含まれます。私はそれがこれらの1つだと仮定しますが、私はそれを見つける方法がわかりません。この提案は、静的コンストラクタにtry/catchブロックを含めるように思われます。書かれているように、明示的な静的コンストラクタはありません。「xxクラスの型初期化器が例外をスローしました」デバッグする方法

明示的な静的コンストラクタを記述し、静的フィールドの初期化をtry/catchブロックにラップする必要があると考えています。私はこれを試すことができることを知っているが、エラーは私のために発生せず、私は試してユーザーにmodded実行可能ファイルを送信したいと思います。私のアプリケーションは、エラーがログに記録されるので、静的なコンストラクタで例外がキャッチされた場合は、彼からログを取得する必要があります。

クラスの関連(私は願っています)の部分が(それは実際に私のコードではなく、必要に応じて、私はそれを国防省することができます)ここにある:

[Serializable] 
    public class PText : PNode, ISerializable { 

    //comments elided by edit for brevity 
     #region Fields 

     public const int PROPERTY_CODE_FONT = 1 << 18; 
     public const int PROPERTY_CODE_TEXT = 1 << 17; 
     public static Font DEFAULT_FONT = new Font("Arial", 12); 
     protected static readonly object PROPERTY_KEY_FONT = new object(); 
     protected static readonly object PROPERTY_KEY_TEXT = new object(); 
     private static Graphics GRAPHICS = Graphics.FromImage(new Bitmap(1, 1)); 

     [NonSerialized] 
     private Color brushColor; 
     private bool constrainHeightToTextHeight = true; 
     private bool constrainWidthToTextWidth = true; 
     private Font font; 

     [NonSerialized] 
     private Color penColor; 

     [NonSerialized] 
     private StringFormat stringFormat = new StringFormat(); 
     private String text; 

     [NonSerialized] 
     private Brush textBrush; 

     #endregion Fields 

     #region Constructors 
     public PText() { 
      textBrush = Brushes.Black; 
     } 

     public PText(String aText) 
      : this() { 
      Text = aText; 
     } 

     protected PText(SerializationInfo info, StreamingContext context) 
      : base(info, context) { 
      textBrush = PUtil.ReadBrush(info, "textbrush"); 
      TextAlignment = (StringAlignment)info.GetValue("alignment", typeof(int)); 
     } 

     #endregion Constructors 
....... 
+0

コードからすべてのコメントを削除しました。主に読みやすくするために、また資産を保護するためです。 –

+0

@Andrasありがとうございました。しかし、これはメリーランド大学から公開されているコードです。 – ScruffyDuck

+0

ああ笑! :) –

答えて

2

あなたの質問に答えるには、あなたが持っていたアイデアが良いです。 try/catchをスローしている可能な行の周りに置き、エラーがTypeInitializationExceptionになる前にログに記録します。

また、Lazyを使用するように変更すると、例外が最初にアクセスされた場所に変更されます。これはあなたにとって役に立つかもしれませんが、それは私に同様の問題をデバッグするのに役立ちました。

2

最小限のコード - を必要とし、デバッグするための最良の方法、変更(これはデスクトップアプリケーションであることを前提としています)は、おそらくAppDomain.UnhandledExceptionイベントにフックすることになります。起動コードでProgram.csに登録してから例外を捕捉できます。あなたが実際にを投稿したコードに

ベースが、それはだ、次のいずれか

public static Font DEFAULT_FONT = new Font("Arial", 12); 

あるいは一つだけのユーザーがそれを報告し、私が正しい場合はされていることを考えると

private static Graphics GRAPHICS = Graphics.FromImage(new Bitmap(1, 1)); 

、 - ロジックは、('once you eliminate the impossible'とそのすべて)、マシンにArialフォントを持たないようにする必要があります。その音が狂ったように。

または - あなたが投稿したコードに基づいてのみ有効であると忠告されているように、それはPNodeタイプで定義された静的タイプでも、階層。例外として「xx」クラスは何報告されていますか?

+1

ええ、うんうんうん、私は、何かの静的な変数は、インサイザで宣言されている可能性がありますも 'PNode'で見ることができません –

+0

@ConradFrix十分な、十分に編集した:) –

+0

ありがとう基本クラス - すべてが型オブジェクトとして定義されています。クラスxxはPTextとして報告されます。 – ScruffyDuck

関連する問題