Ich bin neu in der Programmierung von Vala und habe Erfahrung mit Java und .NET, aber ich konnte nichts finden, was nützlich ist, um mit Vala zu loggen. Gibt es irgendwelche nützlichen Protokollierungsmöglichkeiten wie log4j oder log4net oder wie ist die vorgeschlagene Methode, um sich in Vala einzuloggen, indem man in verschiedene Protokollierungsstufen wie Fehler, Warnung, Debug und Trace skaliert? Und was ist mit defensiver Programmierung wie Behauptungen und Verträge? Gibt es irgendwelche oder was ist der empfohlene Weg, defensive Programmierung zu machen und die meisten nützlichen Logs mit Stack-Spuren und genauer Ursache zu bekommen? Danke für einen Hinweis.Logging mit Vala
Antwort
Vala Logging hat einige ziemlich robuste Protokollierungsmöglichkeiten eingebaut. Sie debug()
verwenden können, message()
, warning()
, error()
und critical()
als Shortcuts für die etwas komplexere log()
Funktion. Alle sind in der Basis enthalten (automatisch enthalten) GLib
namespace.
Wenn Sie die Protokollausgabe umleiten oder verschiedene Arten von Nachrichten an verschiedene Ziele senden möchten, benötigen Sie lediglich GLib.Log
namespace. Vielleicht möchten Sie die glib docs on logging für das lesen, was hinter den Kulissen dort passiert.
Defensive Programmierung
Vala bietet auch Unterstützung für Assertions und Verträge. Die Kurzversion: assert()
und assert_not_reached()
für Assertions und requires()
und ensures()
in Methodensignaturen für Verträge. Weitere Informationen finden Sie im Abschnitt "Tutorial" unter Assertions and Contract Programming.
Fehlerbehandlung
Valas Fehlerbehandlung ist ein wenig seltsam: ähnlich aussehende auf Ausnahmen, aber nicht ganz dasselbe. Der Tutorial-Bereich auf Error Handling deckt die Grundlagen ziemlich gut ab, und wieder könnte es hilfreich sein, die glib docs on errors zu lesen, um ein fortgeschritteneres Verständnis davon zu bekommen, was hinter den Kulissen vor sich geht. Soweit ich weiß, gibt es keine Möglichkeit, einen Stack-Trace von Vala-Fehlern zu bekommen - nur ein Typ und eine Nachricht.
Best Practices
In Bezug auf Best Practices, denke ich Vala ist ähnlich genug, um Java oder C#, dass die Praktiken, die Sie bereits kennen, können in einem allgemeinen Sinn angewendet werden. Ich schlage vor, mit diesen Funktionen herumzuspielen, um ein Gefühl dafür zu bekommen, wie die Details in Vala aussehen. Viel Glück!
Als Ergänzung zu @ chazomaticus große Antwort, können Sie können Stacktrace von Vala bekommen, indem Sie den Call-Stack.
Es ist nur, dass dies nicht in der Vala-Sprache gebacken wird.
passieren ich eine solche Bibliothek geschrieben haben: ivy
Ich mag würde 2 Dinge hinzufügen Antwort auf @chazomaticus:
Warum ich nicht in der Lage bin zu sehen irgendwelche Debug/Protokollausgaben?
Sie müssen die Umgebungsvariable
G_MESSAGES_DEBUG
aufall
setzen. Das wird auch in der Dokumentation erwähnt, aber nicht weiter erläutert. Z.B. für debug:public static int main (string[] args) { // Use "G_MESSAGES_DEBUG=all ./test" to print debug messages! // Output: ``** (process:<PID>): DEBUG: <FILENAME>:<LINE>: my 10. debug message`` debug ("my %d. %s", 10, "debug message"); return 0; } valac --pkg glib-2.0 GLib.debug.vala G_MESSAGES_DEBUG=all ./GLib.debug ./GLib.debug
Wenn Sie die Ausgabe further restrict möchten, können Sie
error
,warning
,critical
,message
,info
,debug
undhelp
stattall
verwenden.Wo finde ich die Dokumentation für jede Protokollierungsfunktion?
Weiterführende Literatur:
Does Vala Unterstützung benutzerdefinierte Nachrichten für Vertragsverletzungen? Oder wird es eine kryptische Standardfehlermeldung geben? Ich versuche, eine gute Möglichkeit zu finden, Fehler zu werfen, und die standardmäßigen Abschnitte "Fehlerbehandlung"/"Vertragliche Programmierung" des Vala-Tutorials scheinen nichts wirklich Nützliches zu beschreiben. – weberc2
Es sieht so aus, als würden Verträge in Aufrufe von g_return_if_fail() kompiliert, was keine benutzerdefinierte Fehlermeldung unterstützt. Und Sie haben Recht, dass die Fehlermeldung aus dem generierten C-Code nicht die beste ist. Wenn Sie möchten, dass benutzerdefinierte Fehler mit Ihren eigenen Nachrichten ausgelöst werden, bietet Vala keinen syntaktischen Zucker für Sie - Sie müssen es nur auf altmodische Weise mit if und throw machen. – chazomaticus