Fehlerbehandlungsstrategien in einer gemeinsam genutzten Bibliothek - C

8

Ich schreibe eine Cross-Plattform-Shared-Bibliothek (% Co_de% in Linux und% Co_de% in Windows) mit C. Derzeit, wenn es einen Fehler gibt, Bibliothek Funktionen gibt den richtigen Fehlercode und schreibt Fehlerinformationen in die .so . Bibliotheksfunktionen senden auch einige Informationen und Debug-Nachrichten an .dll . Dies funktioniert gut für konsolenbasierte Clients.

Jetzt wird diese Bibliothek Client-Programme haben, die eine mit C ++ & amp; wxWidgets. Ich frage mich, was wären die besten Methoden, um die Fehler zu behandeln und zu melden? Kann eine UI-Anwendung auf allen Plattformen auf die Daten stderr und stdout zugreifen?

Eine alternative Methode, die ich dachte, ist, dass die Bibliotheksinitialisierungsfunktion eine Struktur initialisiert, die Funktionszeiger hat. Alle Funktionen in der Bibliothek nehmen eine Instanz dieser Struktur und rufen die Funktionszeiger auf. Auf diese Weise kann der Client auswählen, wo die Nachrichten gedruckt werden sollen.

Ich frage mich, was wäre der offensichtliche Weg, um das zu lösen? Jede Hilfe wäre großartig.

    
Navaneeth K N 17.11.2010, 05:49
quelle

4 Antworten

15

Best Practice (IMHO) ist für eine Bibliothek, nichts in stderr (oder stdout) zu drucken, da sie möglicherweise gar nicht vorhanden sind. Zusätzlich zur GUI-Situation haben Sie auch den Anwendungsfall einer Server-Anwendung, die keine "Konsole" hat und möglicherweise Fehler mit einer Funktion wie syslog () protokollieren möchte.

Einige Vorgehensweisen zur Behandlung von Fehlerinformationen, ohne sie direkt zu drucken:

  • gibt einen numerischen Fehlercode zurück und stellt eine Funktion zum Umwandeln in eine Zeichenfolge bereit

  • gibt einen Struktur- / Objektfehlercode zurück, der zusätzliche Informationen enthält

  • stellt eine Funktion für ein "Session" -Objekt bereit, das Informationen über den letzten Fehler zurückgibt

  • ermöglicht es dem Aufrufer, einen Rückruf zu registrieren, der im Falle eines Fehlers aufgerufen wird

Die einzige Ausnahme zu der Regel "Nicht in stder aus einer Bibliothek schreiben", mit der ich einigermaßen vertraut bin, ist, wenn eine Bibliothek einen "Debug-Modus" -Parameter hat, der das Protokollieren detaillierter Informationen in stderr ermöglicht.

>     
David Gelhar 17.11.2010, 06:15
quelle
10

Im Allgemeinen sollten Sie nicht aus Ihrer Bibliothek in stdout schreiben - auch nicht in eine Konsolenanwendung, die die von der Anwendung erzeugte Ausgabe beschädigen könnte. stderr ist etwas verzeihlicher, aber Sie sollten das immer noch nicht wirklich verwenden, wenn die Anwendung es nicht anfordert.

OpenSSL ist eine plattformübergreifende gemeinsame Bibliothek, die das gleiche Problem zu lösen hatte. Bei ihrer Methode zeichnet die Bibliothek detaillierte Fehlerinformationen in einer internen Fehlerwarteschlange auf, die die Anwendung anfordern kann, wenn ein Fehlerrückgabewert zu sehen ist, und dann dem Benutzer auf die jeweils geeignete Weise angezeigt wird. (Es bietet auch eine praktische Funktion, die die gesamte Fehlerwarteschlange auf ein FILE * ablegt).

    
caf 17.11.2010 06:20
quelle
2

Bei Protokollnachrichten sollten Sie dem Client erlauben, eine Rückruffunktion für die Bibliothek bereitzustellen, damit der Client entscheiden kann, was er mit ihnen machen soll, z. Senden an syslog oder Anzeige in einem Fenster auf dem Bildschirm.

Für die Rückgabe von Fehlern gibt es drei grundlegende Strategien:

  1. gibt einen Fehlercode zurück und hat eine Funktion, die ihn in eine Nachricht
  2. übersetzt
  3. Übergeben Sie einen Zeigerparameter, der auf ein Objekt verweist, das die Fehlernachrichteninformationen enthält
  4. Haben Sie ein globales Bibliotheksobjekt, das Fehlerinformationen von der letzten Operation enthält.

Was auch immer Sie tun, Sie wollen nicht nur die Fehlermeldung protokollieren, weil der Client etwas damit machen möchte. z.B. ein Dialogfeld anzeigen.

Ich würde wahrscheinlich mit 2 meistens gehen.

    
JeremyP 17.11.2010 10:11
quelle
1

Unter Linux sollte der Fehler nicht auf die Standardausgabe (oder den Standardfehler) gedruckt werden, sondern mit rsyslog . Da Sie sich mit GUI beschäftigen, können Sie vielleicht auch ein Meldungsfeld öffnen (nicht immer).

Ich habe keine Ahnung von den Fenstern, aber ich denke, es hat etwas ähnliches.

    
BЈовић 17.11.2010 06:34
quelle