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.
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.
> 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).
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:
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.
Unter Linux sollte der Fehler nicht auf die Standardausgabe (oder den Standardfehler) gedruckt werden, sondern mit rsyslog
Ich habe keine Ahnung von den Fenstern, aber ich denke, es hat etwas ähnliches.
Tags und Links c c++ shared-libraries error-handling