Du machst aber ein "Resume"... und damit ist der Error "gegessen" und die aufrufende Funktion / Sub bekommt nie mit, dass da ein Fehler passiert ist...
Richtig. Mach Dir einfach in Base.logError(...) einen Breakpoint hinter dem Aufruf von ErrorHandler.logError(...)
Ausserdem sollte ein Konstruktor dafür da sein, eine Instanz in einen gerade brauchbaren Zustand zu bringen.
Faustregel: Möglichst wenig Code in Konstruktor.
Errorhandling wird nicht dadurch besser, dass Du es über 3 Methoden verteilst, die sich dann gegenseitig aufrufen. Das sieht zwar erstmal nett aus, verkompliziert aber in der realen Welt den code.
Eine Methode sollte nie gleichzeitig eine Exception loggen UND sie an eine weitere Methode weiterleiten. Immer eins von beiden.
Wenn Du genau darüber nachdenkst, kann so ein code eigentlich nur auf 2 Arten auf einen Error reagieren:
1. Der Anwendungsentwickler kann einen Weg finden, um den Ablauf trotzdem weiterzuführen.
2. Man gibt unterschiedliche Nachrichten an die Administratoren (loggen) und an den Anwender (Messagebox: Something went wrong).
Fall 2 ist wesentlich häufiger. Die Entwickler der Sprache Java führten sogenannte Checked Exceptions ein, die Anwendungsentwickler dazu bringen sollten, Punkt 1. Lösungen zu finden. Das ist aber meistens gar nicht möglich. Die Entwickler der Sprache führten checked Exceptions an Stellen ein, an denen sie völlig fehl am Platz sind.
Vereinfachtes Beispiel: Z.B. gibt es eine Checked Exceptions bei FileHandle.close(...) [heisst in der Klassenbibliothek nicht Filehandle, aber das ist vielleicht verständlicher]. Aber wie soll der Programmierer reagieren, wenn der code, den FileHandle nicht schliessen kann? Höchstens vielleicht noch 10 mal versuchen, aber das hilft in aller Regel auch nicht.
Brian Götz, einer der Mitentwickler der Sprache, sagt heute, dass die damals eigentlich nicht wussten, was sie taten.
Mehr code für Error-Handling heisst nicht unbedingt besseres Error-Handling. Das Gegenteil ist viel häufiger der Fall.