2016-12-01 2 views
4

J'ai ce morceau de code, j'utilise une minuterie pour appeler ma fonction RunTest(). Si je n'utilise pas la minuterie, toutes les exceptions non gérées dans RunTest() sont interceptées, mais avec ce code minuteur, elles ne sont pas interceptées. Quelle erreur suis-je en train de faire?unhandledexception C#

private static TelemetryClient telemetryClient = new TelemetryClient(); 

private static System.Timers.Timer aTimer; 

    static void Main(string[] args) 
    { 

     // Register Unhandled Exception Handler 
     AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
     // Set the Instrumentation Key to track the WebJob Exception 
     TelemetryConfiguration.Active.InstrumentationKey = SecureConfigReader.GetSetting("ApplicationInsightsKey"); 


     Configure(); 

     if (args.Length > 0) 
     { 
      // Create a timer with a ten second interval. 
      aTimer = new System.Timers.Timer(10000); 
      // Hook up the Elapsed event for the timer. 
      aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
      double Scheduled_Interval = Convert.ToDouble(args[0]); 
      // Set the Interval to 300 seconds. 
      aTimer.Interval = TimeSpan.FromSeconds(Scheduled_Interval).TotalMilliseconds; 
      aTimer.Enabled = true; 

      Console.WriteLine("Press the Enter key to exit the program."); 
      Console.ReadLine(); 
     } 
    } 


    private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime); 
     RunTests(); 

    } 
    private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     ExceptionTelemetry excTelemetry = new ExceptionTelemetry((Exception)e.ExceptionObject); 
     excTelemetry.SeverityLevel = SeverityLevel.Critical; 
     excTelemetry.HandledAt = ExceptionHandledAt.Unhandled; 
     telemetryClient.InstrumentationKey = SecureConfigReader.GetSetting("ApplicationInsightsKey"); 
     telemetryClient.TrackException(excTelemetry); 
     //make sure all telemetry is sent before closing the app 
     telemetryClient.Flush(); 
    } 

    /* 
    * 1. Find all tests 
    * 2. Run all tests, collecting all results 
    * 3. Process alerts if any 
    * 4. Save results 
    */ 
    private static void RunTests() 
    { 

     List<SyntheticTransactionTableEntity> results = new List<SyntheticTransactionTableEntity>(); 
     List<ISyntheticTransaction> tests = new List<ISyntheticTransaction>(); 
    } 
+1

Vous n'avez pas un bloc catch try, donc évidemment des exceptions ne sont pas pris. – ThePerplexedOne

+0

Je pense que la syntaxe est 'AppDomain.CurrentDomain.UnhandledException + = new UnhandledExceptionEventHandler (CurrentDomain_UnhandledException)' – bansi

+0

@ThePerplexedOne il utilise [AppDomain.CurrentDomain.UnhandledException] (https://msdn.microsoft.com/en-us/library/ system.appdomain.unhandledexception (v = vs.110) .aspx) – bansi

Répondre

2

Son documenté:

Les prises de composants de la minuterie et supprime toutes les exceptions lancées par gestionnaires d'événements pour l'événement écoulé.

Vous devez prendre dans la méthode OnTimedEvent et propager cette exception Reculez par exemple en le jetant sur un autre fil si vous voulez CurrentDomain_UnhandledException pour l'attraper (throw dans ThreadPool.QueueUserWorkItem())

créer Vous pouvez également un gestionnaire:

private static void TimerExceptionHandler(Exception ex) 
{ 
    Console.WriteLine(ex.ToString()); 
    ... 
} 

passe au ElapsedEventHandler:

aTimer.Elapsed += (sender, e) => { OnTimedEvent(sender, e, TimerExceptionHandler); }; 

Appelez quand une exception est levée:

private static void OnTimedEvent(object source, ElapsedEventArgs e, Action<Exception> timerExceptionHandler) 
    try 
    { 
     RunTests(); 
    } 
    catch (Exception ex) 
    { 
     timerExceptionHandler(ex); 
    } 
+0

Merci! Le problème a été résolu en utilisant System.Threading.Timer comme suggéré par quelqu'un. –