2010-11-24 11 views
1

'static int Main(string [] args)'で始まり、 'EventRecievedProcessor'クラスのインスタンスを作成し、次にメソッドを呼び出しますインスタンス:System.NullReferenceException最初の試行/キャッチブロックでキャッチされていない

static int Main(string[] args) 
{ 
    try 
    { 
     EventRecievedProcessor proc = new EventRecievedProcessor 

     if (!proc.Processs()) 
     { 
      Console.Write(Type + " processing failed. Please check logs for more information."); 
      Log.Error("Failed to process s"); 
      return (int)RETURNCODES.INTERNALAPPERROR; 
     } 
    } 
    catch (Exception ex) 
    { 
     // This is where the System.NullReferenceException from GetLatestEventInfo is currently being caught 

     Console.WriteLine("Exception message: " + ex.Message); 
     Console.WriteLine("Exception stack trace: " + ex.StackTrace); 

     Log.Fatal("An exception has been thrown. Message: " + ex.Message, ex); 

     return (int)RETURNCODES.INTERNALAPPERROR; 
    } 
} 

'EventRecievedProcessor'のインスタンスは、レコードのコレクションを取得し、その上にforeachを実行します。 follwoingメソッドが呼び出され

public class EventRecievedProcessor 
{ 

    public bool Processs() 
    { 
     List<Event> events = DAL.GetEvents; 

     foreach (Event e in events) 
     { 
      try 
      { 
       EventInfo lastEvent = Eventhistory.GetLatestEventInfo(e); 
      } 
      catch (Exception ex) 
      { 
       // Log exception and continue processing in foreach loop 

       // This is where I want to catch the NullReferenceException from GetLatestEventInfo 

       Log.DebugFormat("Error with eventid " + e.EventID); 
       Log.Error(ex); 
      } 
     } 

     return true; 
    } 
} 

、System.NullReferenceExceptionがスローされます:それは、コレクション内の各レコードの「イベント」クラスの静的メソッド(GetLatestEventInfo)を呼び出す

public class EventHistory 
{ 

    public static EventInfo GetLatestEventInfo(int customerCode, string premiscode) 
    { 

     EventInfo info = new EventInfo(); 

     // Do some work here... 
     // This is where the NullReferenceException is being generated. 

     return info; 

    } 
} 

ときNullReferenceExceptionがスローされ、foreachループ内のcatchブロックがcatchし、ログに記録し、処理を続行するためにforeachループに制御を戻します。代わりに、トップレベルの 'Main'メソッドで例外がキャッチされています。つまり、アプリケーションが異常終了し、残りのレコードは処理されません。

例外が最初のcatchブロックをバイパスする方法/理由については、私は迷っています。私がここで間違っていることに関するアイデアは?

スタックトレースを追加:

System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。 C:\ Dev \ release6.01.100 \ Events \ EventProcessor \ EventProcessor \ EventHistory.csのEventProcessor.EventHistory.GetLatestEventInfo(イベントe)の :行65 at EventProcessor.Processors.EventProcessor.Process()in C:\ Dev \ C:\ Dev \ release6.01.100 \ Events \ EventProcessor \ EventProcessor \ Program.csにあるEventProcessor.Program.Main(String [] args)の行32 にあります。 :行132

私はいくつかの名前を掘り下げてしまった場合は申し訳ありません。これは作業コードなので、私はプライバシーの矛盾を避けるため少し変更しようとしました。

+0

あなたは私たちに例外が示されたときから、スタックトレースを示してもらえますか? –

+0

'Event.GetLatestEventInfo'静的メソッドを呼び出すと、(他のクラスの)' EventHistory.GetLatestEventInfo'のソースを表示します。このタイプミスですか、そうでなければなりませんか? – NOtherDev

+0

GetLatestEventInfoの呼び出しによって例外が発生することを確認しましたか(スタックトレースを調べることによって)?おそらくDAL.GetEventsもGetlatestEventInfoを呼び出しますか? –

答えて

2

何もバイパスしません。あなたのスタックトレースを注意深く見てください。 Console.WriteLine(ex.ToString());を使用してください。例外があなたが思ったところからスローされていないことがわかります。

+0

フィードバックJonに感謝します。あなたのポイントを少し拡大できますか?スタックトレースは、例外のソースとしてEventHistory.GetLatestEventInfo()を識別します。 – rgeorge

+0

例外のソースは 'EventHistory.GetLatestEventInfo()'の_inside_です。try/catchブロックがありません。 –

+0

正しい。だから私の期待は、try/catchブロック内にある呼び出しコードに例外がバブルアップするということでした。 – rgeorge

0

これは単にケースではなく、ここに証拠だ:

class Program 
{ 
    static void Main() 
    { 
     // no need of try/catch here as exceptions won't propagate to here 
     Looper(); 
    } 

    static void Looper() 
    { 
     int processedRecords = 0; 
     for (int i = 0; i < 10; i++) 
     { 
      try 
      { 
       Thrower(i); 
       processedRecords++; 
      } 
      catch (NullReferenceException ex) 
      { } 
     } 
     // prints 5 as expected 
     Console.WriteLine("processed {0} records", processedRecords); 
    } 

    static void Thrower(int i) 
    { 
     if (i % 2 == 0) 
     { 
      throw new NullReferenceException(); 
     } 
    } 
} 
関連する問題