2011-11-22 12 views
6

Czasami występują wyjątki. Kiedy to zrobią, zostaną zalogowani, a następnie przeanalizowani. Dziennik zawiera oczywiście informacje o stosie i inne globalne informacje, ale często brakuje kluczowego kontekstu. Chciałbym opisać wyjątek z tymi dodatkowymi informacjami, aby ułatwić późniejsze debugowanie.Dodawanie adnotacji Wyjątki z dodatkowymi informacjami bez ich przechwytywania

  • ja nie chce try{...}catch{... throw;} ponieważ liczy się jako połowu wyjątek i sprawia, że ​​trudniej debugowania (w trakcie rozwoju Chciałbym aplikację, aby zatrzymać i debugger do reagowania, gdy oryginał jest wyjątek, a nie gdy najbardziej nieprzechwycony wyjątek jest). Moduły obsługi wyjątków pierwszej szansy nie stanowią obejścia, ponieważ istnieje niestety zbyt wiele fałszywych alarmów.
  • Chciałbym uniknąć nadmiernego obciążenia w normalnym, nie wyjątkowym przypadku.

Czy istnieje sposób przechowywania kluczowych elementów kontekstu (np. Przetwarzana nazwa pliku itp.) W wyjątku w sposób, który nie przechwytuje wyjątku?

+1

Interesujące. Czy myślałeś o zawijaniu 'try {' i '} catch {... throw;}' in '#if! DEBUG'. W dev dostaniesz oryginalny wyjątek z oryginalnej strony z ogłoszeniami. –

+0

Co powiesz na użycie try {..} catch {.. throw;} pattern, ale zmień opcje Visual Studio, aby złamać się po wygenerowaniu wyjątku CLR. – Simon

+2

Wygląda na to, że dobrze pasuje do AOP jak PostSharp, ale to nie spełnia Twoich wymagań, aby go nie złapać. Po prostu usuwa ilość kodowania, którą musisz wykonać. –

Odpowiedz

1

Zastrzeliłem ten budynek z sugestii Adama o Aopie. moje rozwiązanie byłoby Unity zamiast PostSharp i jedyne pytanie to to, czy wyjątek jest złowionych w środku z powołaniem, które prawdopodobnie jest ...

 public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) 
    { 
     //execute 
     var methodReturn = getNext().Invoke(input, getNext); 

     //things to do after execution 
     if (methodReturn.Exception != null) 
      methodReturn.Exception.Data.Add("filename", "name of file"); 

     return methodReturn; 
    } 
} 
+0

Nie jest dla mnie jasne, jak wyglądałby normalny kod. Więc jeśli 'A' wywołuje' B', wywołuje 'C' i' B', aby zanotować ewentualne wyjątki przez 'C' z informacją - jak byś tego użył? –

1

Nie ma nic złego z następującym wzorem:

try 
{ 
    // Do Something 
} 
catch (GeneralException ex) 
{ 
    throw new SpecificException(
     String.Format("More specifics ({0}) in message", someData), 
     moreContext, 
     new {even, more, context}, 
     ex); 
} 

To jest dokładnie ten wzór, który można wykorzystać, na przykład, kiedy "Zrobić coś" jest, na przykład, otwarcie jakiegoś pliku. "SpecificException" może być "nie można odczytać pliku konfiguracyjnego".

+0

Problem tutaj jest dwojaki: po pierwsze, ogólnie jest po prostu bałaganem i chciałbym to robić systematycznie. Zagnieżdżone w zagnieżdżonych w zagnieżdżonych w zagnieżdżonych wyjątkach [...] nie pomaga w prostszym, płaskim podejściu; nie wspominając o tym, że w efekcie koszt rzucania wyjątków może w końcu stać się kwadraturowy, w taki sposób, że w przeciwieństwie do liniowego. Po drugie, i bardziej natychmiast denerwujące, powoduje to przechwycenie wyjątku, co komplikuje debugowanie opisane w pytaniu. –

+0

Po drugie jednak; jest bardzo mało prawdopodobne, że spowodowałoby to złożoność w czasie kwadratowym (chociaż trzeba mieć pewność, że są to obiekty wewnętrzne CLR). Jednak to rozwiązuje problemy związane z bałaganem i debuggability. –

+0

Nawiasem mówiąc, właśnie to teraz robię; to działa, ale szukam czegoś lepszego :-) –

0

Nie używałbym AOP do przechwytywania wyjątków. Zamiast tego użyłbym klasy przechwytującej do LOGowania wyjątku + wszystkich argumentów do metody, która rzuciła wyjątek. A następnie niech oryginalny wyjątek zostanie ponownie rzucony.

+0

-1: zły pomysł. Jeśli wyjątek się nie rozprzestrzenia, nie przechwytujesz całego stosu wywołań. Zaloguj wyjątek na samej górze, dodając dodatkowe informacje w pobliżu strony wywołania, zgodnie z żądaniami PO. –

+0

Dlaczego to zły pomysł? Niektóre frameworki przechwytujące po prostu 'throw;' Stos wywołań jest zarezerwowany – jgauffin

+0

"reserved" = "zachowany" – jgauffin

Powiązane problemy