Eine Einführung in die Fehlerbehandlung in Sass

Unabhängig von der Sprache sollten Fehler auf saubere und einfache Weise gehandhabt werden, sei es für den Endbenutzer oder den nächsten Entwickler. Wenn Sie eine falsche Aktion für eine Site ausführen, sollte Sie nicht nur ein Fehlercode oder ein fehlgeschlagener Befehl angezeigt werden. Es sollte Sie mit einer expliziten Nachricht darüber informieren, was los ist.

Dies sollte bei der Programmierung für andere Entwickler nicht anders sein. Wenn Sie eine Bibliothek oder ein Framework erstellen oder einfach in einem Team arbeiten, können Sie nicht nur den Code verwenden. Möglicherweise müssen viele Entwickler mit sehr unterschiedlichen Hintergründen Ihren Code verwenden, und sie sollten nicht tief in die Quelle und die Wendungen Ihres Geistes eintauchen müssen, um herauszufinden, was los ist.

Deshalb sollten Sie Fehler richtig behandeln. Sogar in Sass. Auch wenn es zu etwas so freizügigem wie CSS kompiliert wird. Wenn Sie eine benutzerdefinierte Funktion oder ein Mixin erstellen, sollten Sie immer sicherstellen, dass alles wie erwartet funktioniert. Wenn dies nicht der Fall ist, sollten Sie einen anderen Weg einschlagen. 

Ich weiß es nicht für dich, aber ich mag es wirklich nicht, wenn der Sass-Compiler ausfällt. Ich hätte lieber eine coole kleine Nachricht, die mir erklärt, dass ich einen Streit vergessen habe, anstatt mich zu stellen:

Lange Geschichte kurz: Fehler richtig behandeln. Ich zeige dir wie.

Was ist zu prüfen??

Sicherstellen, dass alle Argumente angegeben sind

Beim Erstellen einer Funktion müssen Sie zunächst sicherstellen, dass alle Argumente angegeben sind. Leider geht Sass nicht einmal in die Funktion, wenn die Anzahl der übergebenen Argumente falsch ist. Glücklicherweise behandelt der Compiler dies mit einer Nachricht wie: Mixin my-awesome-mixin fehlt das Argument $ the-awesome-argument. also ist es nicht so schlimm.

Wenn Sie dies nicht in den Händen des Compilers belassen möchten und lieber selbst damit umgehen möchten, können Sie dies umgehen, indem Sie für alle Argumente aus der Funktion / mixin Standardparameter angeben. Es ist nicht nur besser für den Endbenutzer, keine Angaben machen zu müssen alles Argumente jeden einmalig, aber es ermöglicht Ihnen auch, das Mixin / die Funktion in allen Fällen auszulösen und zu tun, was immer getan werden muss.

Sicherstellen, dass Argumente gültig sind

Das Wichtigste ist jetzt, sicherzustellen, dass alle Argumente gültig sind. Wenn Sie beispielsweise eine Farbe benötigen, müssen Sie sicherstellen, dass der Entwickler tatsächlich eine Farbe an die Funktion weitergibt und nicht eine Zahl oder eine Zeichenfolge. Wenn Sie eine Liste mit drei Werten benötigen, sollten Sie die Länge überprüfen, um sich zu vergewissern sind drei Werte, nicht zwei oder vier. 

Glücklicherweise macht es Sass sehr einfach, dies mit einer Reihe von Standardfunktionen zu tun, einschließlich Art der() um den Datentyp eines Wertes zu überprüfen. Übrigens sollte Sass 3.4 sogar einführen is-type-of ($ value, $ type) um das Problem der Testart zu umgehen () die immer wiederkehrt Liste während es auch eine Karte sein kann.

Selbst wenn Sie einen Code für Entwickler mit guten Sass-Kenntnissen schreiben, sollten Sie auf die Eingabe Ihrer Funktionen achten. 

Zum Beispiel beim Tun $ value: $ input + "px", Sie gießen im Grunde eine Zahl (wenn $ input ist eine Zahl, offensichtlich) zu einer Zeichenfolge. Dann, wenn Sie versuchen, es zu tun $ wert * 2, Sass gibt einen Fehler aus, weil Sie versuchen, eine Zeichenfolge zu multiplizieren. Weitere Informationen zu diesem Phänomen in diesem Artikel.

… In einer Funktion

Der Umgang mit Fehlern im Falle einer benutzerdefinierten Funktion ist eigentlich ganz einfach: Sie überprüfen, ob etwas überprüft werden muss. Wenn die Bedingung nicht übereinstimmt, kehren Sie zurück falsch (oder Null, siehe unten) und warnen den Benutzer mit Hilfe des @warnen Sass-Richtlinie.

@ function add-10 ($ number) @if type-of ($ number)! = "number" @warn "'# $ number' ist keine Nummer von 'add-10'."; @falsch zurückgeben;  @return $ number + 10 zurückgeben; 

In diesem (ziemlich albernem zustimmen) Fall, wenn die $ number Argument ist keine Zahl, die Funktion wird zurückgegeben falsch und der Benutzer wird durch eine in seinem Terminal erscheinende Nachricht darauf hingewiesen, dass er ein falsches Argument übergeben hat: 'SWAG' ist keine Nummer für 'Add-10'.

Wenn das Argument gültig ist, wird einfach die Zahl + 10 zurückgegeben. Einfach als Kuchen.

… In einer Mischung

Beim Umgang mit einem Mixin ist es etwas komplizierter, da Sie eigentlich nichts zurückgeben. Stattdessen werden CSS-Regeln ausgegeben. Um das Problem zu umgehen, müssen Sie einen Boolean deklarieren, der als Gültigkeitsprüfer dient. Bitte beachten Sie folgendes Beispiel:

@mixin module ($ name) // Eine Gültigkeitsprüfung initialisieren Boolean $ everything-okay: true; // Überprüfung der Gültigkeit des Arguments @if type-of ($ name)! = "String" @warn "'# $ name' ist kein String für 'module'."; $ alles-okay: falsch;  // Wenn alles noch in Ordnung ist, mischen Sie den Inhalt mit Inhalt @if $ everything-okay @content; 

Ein Wort zur Liste

Wenn Sie sicherstellen möchten, dass eines der Argumente eine Liste mit mehreren Elementen ist, sollten Sie immer die Länge und nicht den Datentyp testen. Einfach ausgedrückt, behandelt Sass alle Werte als Einzelelementlisten. In einigen Fällen können Sie sich auch mit einer Einzelelementliste befassen, die eigentlich immer noch eine ist Liste.

Auf der anderen Seite ein mögliches Problem bei der Überprüfung der Länge ist, dass es eine sein kann Karte auch. Um absolut sicher zu gehen, dass Sie mit einer Liste mehrerer Werte konfrontiert werden, gehen Sie folgendermaßen vor:

@if length ($ value)> 1 und type-of ($ value)! = map // Dies ist eine Liste mit mehreren Werten

Wann wird zu viel geprüft??

Wenn ich ganz ehrlich bin, würde ich niemals sagen. Sie können niemals zu vorsichtig sein und möglicherweise nach Argumenten für Funktionen und Kombinationen Ihrer Anwendung suchen. Das ist aber wahrscheinlich nicht nötig. Ich habe eine goldene Regel, wenn es um Argumente geht: Wenn der Wert wahrscheinlich zum Absturz des Sass-Compilers führt, sollten Sie ihn überprüft haben

Das bedeutet, wenn Sie ein Mixin haben, das Argumente akzeptiert, die direkt als Werte für CSS-Eigenschaften verwendet werden, glaube ich nicht, dass es sinnvoll ist, sie aggressiv zu überprüfen. Im schlimmsten Fall werden diese Werte in der CSS-Ausgabe gespeichert, was zu ungültigem CSS führt, das vom Browser nicht verstanden wird. Abgesehen von ein paar zusätzlichen Bytes, wird es keinen großen Schaden geben.

Betrachten Sie zum Beispiel das folgende Mixin:

@Mixin-Größe ($ width, $ height: $ width) width: $ width; Höhe: $ Höhe; 

Und nun betrachten Sie die folgende Verwendung:

.Element @ include size (10, "string"); 

Das resultierende CSS wird sein:

.Element Breite: 10; Höhe: "String"; 

Jeder Browser lehnt einfach beide Eigenschaften ab, da ihre Werte ungültig sind. Keine große Sache.

Fehler in tief verschachtelten Funktionen behandeln

Mit dem, was wir gerade gesehen haben, sollten Sie in der Lage sein, 99% der möglichen Fehler korrekt zu behandeln, jedoch dort ist ein Fall, in dem es schwieriger wird, mit Sass Schritt zu halten: beim Umgang mit Fehlern einer Funktion, die von einer Funktion aufgerufen wird, die von einer Funktion aufgerufen wird…

Genau das habe ich mit SassyJSON, einem in Sass geschriebenen JSON-Parser, erlebt. Grundsätzlich übergeben Sie einen JSON-String an Json-Decode Funktion, die es an die weiterleitet  _json-decode - wert Funktion, die es dann an a weiterleitet _json-decode - * Funktion abhängig vom Typ des Wertes, der analysiert wird. Jedenfalls war es nicht ungewöhnlich, dass drei, vier, vielleicht fünf Funktionsaufrufe ineinander verschachtelt waren.

In einem solchen Fall gibt es leider keine saubere Möglichkeit, die Ausführung zu stoppen. Sie müssen Ihre Fehler in die obere Ebene sprudeln lassen, indem Sie die Funktionsrückgabe auf jeder Ebene manuell überprüfen. Wenn Sie z. B. einen Fehler in der tiefsten Funktion haben, sollte die aufrufende Funktion false zurückgeben, die dann diesen Wert überprüfen sollte falsch, Kehren Sie also zur oberen Funktion zurück und so weiter, bis Sie die höchste erreichen, die dann die Ausführung stoppt.

Das ist ziemlich schmerzvoll, aber es gibt keine Wahl. Wenn Sie jedoch mehrere Ebenen von Funktionen verschachteln müssen, würde ich sagen, dass Sie Sass nicht korrekt verwenden.

Was Sie im Falle eines Fehlers zurückgeben müssen

Wenn etwas schief geht, können Sie verschiedene Werte zurückgeben, falsch und Null die beliebtesten zu sein. Ich denke, du könntest zurückkehren -1 oder ungültig 0 wenn Sie aus einem JavaScript-Hintergrund stammen. Ich denke, du könntest auch so etwas zurückgeben FEHLERCODE Dies würde jedoch die Überprüfung auf einen Fehler etwas komplizierter machen.

Ich komme zurück falsch weil das für sich spricht: es ist falsch. Dies kann jedoch ein Problem mit Funktionen sein, die einen Boolean-Wert zurückgeben sollen. Wie würden Sie wissen, wenn die Funktion zurückkehrt? falsch weil das Ergebnis ausgewertet wurde falsch, oder falsch weil ein Fehler aufgetreten ist?

Sie können sich also entscheiden, einen anderen Wert auszuwählen. Es gibt eine interessante Sache mit Null: eine CSS-Eigenschaft mit einem Wert von Null wird nicht zur Quelle kompiliert. Im Grunde bedeutet dies, dass, wenn Sie eine Sass-Funktion als Wert für eine CSS-Eigenschaft verwenden und etwas nicht stimmt, die CSS-Eigenschaft vom Sass-Compiler einfach weggelassen wird.

Ich denke, das ist für so etwas irgendwie nett:

.element background: get-color-from-theme ('admin'); 

Wenn die funktion get-color-from-theme wurde gut entworfen, sollte es sicherstellen, dass Administrator Theme existiert und ist eigentlich an einen Farbwert gebunden. Ob Administrator existiert nicht, dann würde die Funktion zurückkehren Null was dazu führen würde Hintergrund: null. Dies führt dazu, dass Sass die Regel beim Kompilieren der Datei in CSS auslässt.

Benötigt ein werfen() Funktion

Die meisten Sprachen haben eine werfen Funktion oder Direktive. Normalerweise akzeptiert diese Funktion eine Fehlermeldung oder eine Ausnahme als einziges Argument und stoppt einfach die Skriptausführung, um diese Meldung anzuzeigen (in der Konsole oder in etwas anderem), wenn ein Fehler auftritt. In JavaScript können Sie beispielsweise Folgendes tun:

if (typeof myVariable === "undefined") Neue UserException auslösen ("'myVariable' sollte definiert werden");  

Leider hat Sass das nicht. Grundsätzlich gibt es in Sass absolut keine Möglichkeit, die Ausführung einer Funktion oder eines Mixins zu stoppen. Sie könnten eine bauen, aber die Funktion würde praktisch nicht gestoppt, es würde nur false zurückgeben und eine Nachricht protokollieren.

@Funktionsauswurf ($ log) @warn $ log; @falsch zurückgeben; 

Anstatt manuell zu schreiben @warnen Richtlinie und die @falsch zurückgeben Sie können jedes Mal die werfen() funktionieren, denken Sie jedoch daran, dass es keine Zauberei gibt oder das Skript nicht ausgeführt wird. Es gibt einfach 'false' zurück und protokolliert eine Fehlermeldung.

Dass gesagt wurde, eine zu haben werfen Sass-Betreuern wurde schon einige Male eine Direktive gebeten, und es scheint, dass sie zugestimmt haben, dass es nicht so schlimm wäre, eine @Error Direktive, die den aktuellen Geltungsbereich gemäß Ausgabe 747 bricht. Vielleicht für 3.4 bin ich mir nicht sicher.

Abschließende Gedanken

Unabhängig davon, wie Sie es tun, sollten Sie immer die Funktion und die Mixing-Eingänge überprüfen, anstatt den Compiler abstürzen zu lassen, da etwas Unerwartetes aufgetreten ist. Als Entwickler hätte ich lieber ein sauberes Protokoll und nichts ausgegeben als eine riesige Stack-Ablaufverfolgung, aber auch das bin ich nicht.

Als Live-Beispiel schlage ich vor, dass Sie sich eine kleine Schaltflächenbibliothek ansehen, die ich vor einiger Zeit erstellt habe. Der größte Teil des Codes aus dem Core-Mixin besteht aus der Prüfung von Argumenten und der Fehlerbehandlung. Das Mixin wirkt dadurch sehr voll, aber ich denke, es ist für Entwickler, die den Code verwenden, unerlässlich.

Stellen Sie am Ende sicher, dass Sie etwas finden, das sowohl zu Ihnen als auch zu Ihrem Team passt.