2010-11-24 10 views
1

Ich habe eine C# -Konsolen-App, die in 'static int Main (string [] args)' beginnt, erstellt eine Instanz der Klasse 'EventRecievedProcessor' und ruft dann eine Methode auf die Instanz:System.NullReferenceException nicht im ersten Versuch/Catch-Block

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; 
    } 
} 

die Instanz von ‚EventRecievedProcessor‘ packt eine Sammlung von Aufzeichnungen und macht einen foreach darüber. Er fordert eine statische Methode (GetLatestEventInfo) auf der ‚Ereignis‘ Klasse für jeden Datensatz in der Sammlung:

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; 
    } 
} 

Wenn die follwoing Methode aufgerufen wird, ein System.NullReferenceException ausgelöst wird:

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; 

    } 
} 

Wenn Die NullReferenceException wird hier ausgelöst, ich würde erwarten, dass der catch-Block in der foreach-Schleife ihn abfängt, protokolliert und dann die Steuerung an die foreach-Schleife zurückgibt, um mit der Verarbeitung fortzufahren. Stattdessen wird die Ausnahme in der Hauptmethode auf der obersten Ebene abgefangen, was bedeutet, dass die App abgebrochen wird und die verbleibenden Datensätze nicht verarbeitet werden.

Ich bin im Verlust, wie/warum die Ausnahme den ersten catch-Block umgeht. Irgendwelche Ideen, was ich hier falsch mache?

Hinzufügen der Stapelüberwachung:

System.NullReferenceException: Objektverweis nicht auf eine Instanz eines Objekts. bei EventProcessor.EventHistory.GetLatestEventInfo (Ereignis e) in C: \ Dev \ Release6.01.100 \ Ereignisse \ EventProcessor \ EventProcessor \ EventHistory.cs: Zeile 65 bei EventProcessor.Processors.EventProcessor.Process() in C: \ Dev \ Release6.01.100 \ Ereignisse \ EventProcessor \ EventProcessor \ Processors \ EventProcessor.cs: Zeile 32 bei EventProcessor.Program.Main (String [] args) in C: \ Dev \ release6.01.100 \ Events \ EventProcessor \ EventProcessor \ Program.cs : line 132

Sorry, wenn ich einige der Namen gekaut habe. Das ist Arbeitscode, also habe ich versucht, es etwas zu ändern, um irgendwelche Datenschutzkonflikte zu vermeiden.

+0

Können Sie uns zeigen den Stack-Trace aus, wenn die Ausnahme angezeigt wird? –

+0

Sie rufen die statische Methode "Event.GetLatestEventInfo" auf, und Sie zeigen uns die Quelle für "EventHistory.GetLatestEventInfo" (aus einer anderen Klasse). Ist das ein Tippfehler oder sollte es so sein? – NOtherDev

+0

Haben Sie überprüft, ob der Aufruf von GetLatestEventInfo die Ausnahme auslöst (indem Sie auf den StackTrace schauen?). Vielleicht ruft DAL.GetEvents auch GetlatestEventInfo auf? –

Antwort

2

Es wird nichts umgangen. Schauen Sie sich Ihren Stack-Trace genau an. Verwenden Sie Console.WriteLine(ex.ToString());. Sie werden feststellen, dass die Ausnahme nicht von dem Ort stammt, an dem Sie es vermutet haben.

+0

Danke für das Feedback Jon. Könnten Sie Ihren Punkt ein wenig erweitern? Die Stack-Ablaufverfolgung identifiziert EventHistory.GetLatestEventInfo() als die Quelle der Ausnahme. – rgeorge

+0

Die Quelle der Ausnahme ist _inside_ von 'EventHistory.GetLatestEventInfo()', wo Sie keinen try/catch-Block haben. –

+0

Korrekt. Also war meine Erwartung, dass die Ausnahme zu dem aufrufenden Code übergehen würde, der sich in einem try/catch-Block befindet? – rgeorge

0

Das ist einfach nicht der Fall, und hier ist der Beweis:

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(); 
     } 
    } 
} 
Verwandte Themen