{Przydatne kody} ExceptionWrapper.

Poniżej przedstawiam krótką metodę, pozwalającą na łatwe połączenie logowania błędów wraz z nazwą metody gdzie ten błąd wystąpił.

Metoda ma na celu wykonanie dowolnej operacji  i w razie wystąpienia wyjątku przekazanie wyjątku dalej wraz z nazwą metody w której wystąpił wyjątek.

Kiedy może się przydać?

Stosuje ją tam gdzie:

  • Potrzebuje nazwy metody, która zgłasza wyjątek lub innych danych.
  • Metoda zwraca Null i powinien to być wyjątek (szczególnie gdy to się powtarza w różnych metodach)
  • Trudno jest założyć warunek try, catch na całość kodu by obsłużyć błędy uniwersalnie.

Kod poniżej:

public static T ExceptionWrapper<T>(Func<T> func, string methodName)
        {
            try
            {
                var rezult = func.Invoke();

                if (rezult is ValueType)
                {
                    return rezult;
                }

                if (rezult == null)
                {

                    throw new Exception("Brak danych!");
                }

                return rezult;
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("Method name: {0} \n Message: {1}", methodName, e.Message), e);
            }
        }

Kod jest bardzo prosty. Do metody przesyłamy 2 argumenty. Delegata, który zwraca wartość T oraz nazwę metody lub inne potrzebne dane. Następnie wykonujemy metodę.

Następnie sprawdzamy czy zwrócona wartość jest typem wartościowym czy referencyjnym. Jeśli referencyjnym to sprawdzamy czy jest nullem. Jeśli tak to wyjątek “Brak danych:

Przydaje się to wtedy gdy sprawdzanie czy obiekty są nullami występuje często w kodzie. Najczęściej w wzorcu konstrukcyjnym buildier. Taka metoda może oszczędzić pracy przy analizowaniu błędów.

Jeśli metoda rzuciła wyjątkiem to opakowujemy wyjątek w swój wyjątek. Nasz wyjątek zawiera potrzebne nam dane, jak nazwę metody czy inne dane.

Przypominam, że nazwa metody, która rzuciła wyjątkiem znajduje się w każdym rzucanym wyjątku typu Exception.

  catch (Exception e)
            {
                var exceptionMethodName = e.TargetSite.Name;
            }

Tak samo jak parametry metody:

  catch (Exception e)
            {
               var firstParametrMethodName = e.TargetSite.GetParameters().Select(parametr=>parametr.Name);
            }

ExceptionWrapper może jednak być przydatny przy nie których specyficznych zastosowaniach.