2010-07-17 2 views
9

Was wäre eine gute Möglichkeit, Fehler in JavaScript zu melden, anstatt sich auf Nullen zu verlassen, undefiniert, wenn Fehler auftreten und eine Funktion nicht fortfahren kann. Ich kann mich drei Ansätze:JavaScript Anti-Silent-Techniken zur Fehleranzeige

  1. nichts tun
  2. eine Ausnahme werfen
  3. assert

Hier ist ein einfaches Beispiel-Szenario - eine Funktion, die ein Benutzerkonto mit dem Betrag übergebenen gutschreibt. Die Funktion credit ist Teil eines Objekts Account.

Hier ist die naive Lösung.

Ein Hauptproblem bei diesem Ansatz sind ungültige Daten. Lassen Sie uns das beheben und verwenden Sie einen Rückgabewert, um anzuzeigen, dass der Vorgang fehlgeschlagen ist.

Dies ist eine Verbesserung gegenüber dem vorherigen, Clientcode muss jedoch den Rückgabewert überprüfen, um sicherzustellen, dass der Vorgang erfolgreich war. Dies für praktisch jede Methode im System zu tun, kann mühsam werden.

Ein dritter Ansatz, der dem zweiten ähnlich ist, ist das Auslösen einer Ausnahme. Da wir die Ausnahme selbst auslösen, könnte eine bestimmte Ausnahme eher als eine allgemeine Ausnahme ausgelöst werden.

function credit(amount) { 
    if(!isInt(amount)) { 
     throw new InvalidAmountError(amount); 
    } 
    this.balance += amount; 
} 

Ein vierter Ansatz, der dem Auslösen von Ausnahmen ähnelt, besteht darin, Assertions in Ihrem Code zu verwenden. Ein Nachteil im Vergleich zu dem obigen Ansatz besteht darin, dass die Möglichkeit, benutzerdefinierte Ausnahmen auszulösen, verloren geht, da die Assertion generisch ist. Es ist jedoch immer noch möglich, das Objekt zu übergeben, um jeden Assert-Aufruf zu werfen.

function credit(amount) { 
    assert(!isInt(amount), "Amount to credit is not an integer"); 
    this.balance += amount; 
} 

Eine globale assert Funktion ist einfach zu schreiben und macht den Code ein wenig kürzer.

Aus diesen Ansätzen, was wäre ein guter Weg, um mit unerwarteten Werten und unglücklichen Pfaden umzugehen. Gibt es andere Ansätze, die hier nicht erwähnt werden, die nützlich sein könnten?

+2

'alert()' ist anti-silent :) –

+0

Dies ist einer der nervigsten Aspekte von dynamisch typisierten Sprachen. – ChaosPandion

+0

@meder - haha, 'alert' ist das lauteste von allen :) – Anurag

Antwort

2

Betrachten Sie ein clientseitiges Protokollierungs-Framework, um Fehler zu melden, z. B. Log4js. Man kann Nachrichten (d. H. Info, debug, warn, error) im Browser protokollieren oder Nachrichten an den Server über Ajax persistieren, abhängig von der Anwendung.

Die Log4js-Website bietet auch eine list of other JavaScript logging frameworks.

Ein guter Ansatz, Ihr benutzerdefiniertes Ausnahmebeispiel zu verwenden, wäre, die Ausnahme auszulösen und den Fehler nach eigenem Ermessen zu protokollieren.

2

Ein Nachteil im Vergleich zu dem oben Ansatz besteht darin, dass, da die Assertion generisch ist, verlieren wir die Fähigkeit individuelle Ausnahmen

Nicht unbedingt zu werfen:

function assert(value,message,Exctype) { 
    if(value !== true) throw new Exctype(message); 
} 

Konstrukteurs sind Funktionen. Funktionen sind erstklassige Werte. Fühlen Sie sich frei, sie herumzugeben.

Verwandte Themen