2011-12-19 25 views
5

I obecnie obsłużyć moje wyjątki tak:Czy mogę przenieść mój kod wyjątku do funkcji obsługi. Więc nie trzeba powtarzać tego samego kodu

try { 

     } 
     catch (ServiceException ex) { 
      ModelState.Merge(ex.Errors); 
     } 
     catch (Exception e) { 
      Trace.Write(e); 
      ModelState.AddModelError("", "Database access error: " + e.Message); 
     } 

To działa, ale jest to ten sam kod powtarzam wielokrotnie. To, czego szukam, to sugestia, w jaki sposób mogę przenieść to do funkcji zewnętrznej. Niekoniecznie muszę przenieść blok try tam, ale przynajmniej drugi kod.

Może funkcja, która przeszła Exception i ModelState (jako odniesienie). Czy ktoś może zaproponować czysty sposób, w jaki mógłbym zakodować tę funkcję? Pytam o to, ponieważ prawie zawsze ktoś wymyśla rozwiązanie, o którym nigdy bym nie pomyślał. Dzięki Samantha.

+0

W podobny sposób postępujesz z tymi wyjątkami, więc nie widzę, jak powtarzasz kod? Jeśli masz na myśli to, że jest on używany gdzie indziej, zawsze możesz utworzyć prywatną metodę, która obsługuje operacje wyjątków. – Prisoner

+1

Tak, możesz przekazać wyjątek do dowolnej innej funkcji. –

+0

Przepuścić wyjątek jako parametr do funkcji? Następnie możesz użyć tej funkcji tyle razy, ile chcesz, zmieniając tylko wyjątek zgłoszony. –

Odpowiedz

5

Można zrobić metodę, która trwa w działaniu, i wywołuje go w bloku try/catch:

private void RunAndHandleExceptions(Action action) 
     { 
      try 
      { 
       action.Invoke(); 
      } 
      catch (ServiceException ex) 
      { 
       ModelState.Merge(ex.Errors); 
      } 
      catch (Exception e) 
      { 
       Trace.Write(e); 
       ModelState.AddModelError("", "Database access error: " + e.Message); 
      } 
     } 

i nazwać tak:

RunAndHandleExceptions(new Action(() => 
       { 
        //Do some computing 
       })); 

EDIT: z parametr (przykład, można uruchomić w programie konsoli):

private static void ParameterizedTask() 
    { 
     Task.Factory.StartNew(new Action<object>((y) => 
     { 
      Console.WriteLine(y); 
     }), 5); 
     Thread.Sleep(1500); 
    } 
//OUTPUT: 5 

Za mo Aby uzyskać więcej informacji, możesz przejrzeć wątek this.

+0

Ty robisz nie trzeba deklarować nowej Akcji. Można to zrobić tak ... RunAndHandleExceptions (() => { // Wykonaj niektóre obliczenia }); – Paul

+0

Może to zmienić na metodę rozszerzenia dla ModelState, aby strona wywołania wyglądała podobnie do 'Model.RanAndHandle (() => ...); – asawyer

+0

To nadal wymaga od niego złapania dwóch Wyjątków. Wszystko, co robisz, to powtarzanie jednej linii zamiast kilku. –

2

(Aktualizacja dopasować nowy wymóg PO w komentarzach)

private void HandleException(Action<IEnumerable<string>> action, 
    IEnumerable<string> parameters) 
{ 
    try { 
    action(parameters); 
    } 
    catch (ServiceException ex) { 
    ModelState.Merge(ex.Errors); 
    } 
    catch (Exception e) { 
    Trace.Write(e); 
    ModelState.AddModelError("", "Database access error: " + e.Message); 
    } 
} 

który może być wywołany z lambda na przykład:

HandleException((parameters) => Console.WriteLine(parameters.FirstOrDefault()), 
           new string[] {"Pretty safe in this case"}); 
+0

Muszę przekazać niektóre parametry do mojej akcji. Czy możesz mi pokazać, jak mogłem to zrobić? Może po prostu bardzo prosty przykład, w którym przekazuję kilka ciągów do kodu akcji. –

+0

@Melissa Zaktualizowałem kod odpowiednio –

1

Poza przejściu wyjątku do innej funkcji, jak było sugerowane w komentarzach, można również przekazać kod do uruchomienia jako Action do funkcji, która następnie uruchomi akcję w próbie catch.

Powiązane problemy