2013-11-09 11 views
13

Gibt es eine Möglichkeit in Javascript, die Laufzeit zu machen, eine andere Objektdarstellung in den Fehlermeldungen verwendet werden.Javascript Fehlermeldungen, individuelle Objektdarstellung

Eine typische Fehlermeldung

Uncaught TypeError: Object [object Object] has no method 'toggle'

Es wäre hilfreich, wenn wir eine bessere Darstellung auf das Objekt als [object Object] .In anderen Sprachen geben können, man kann es eine bessere Darstellung des Objekts machen Druck durch zwingende toString().

Allerdings sieht es so aus zwingenden toString keine Wirkung in diesem Fall hat.

+0

alle Haben die Browser tun oder nur IE? In Firefox und Chrome bekomme ich normalerweise ziemlich gute Fehlermeldungen. Die Zeile sollte da sein, damit Sie kurz vor dem Fehler 'console.log (theObject);' – HMR

+0

Ich habe die Fehlermeldung von Chrome tatsächlich kopiert. –

+1

Ja, das ist keine sehr hilfreiche Nachricht. Chrome kann bei einem Fehler unterbrochen werden, und Sie befinden sich in der Zeile, die den Fehler verursacht hat. Drücken Sie F12, Registerkarte Quellen, Schaltfläche im unteren Bereich, die wie ein Stoppschild mit einem Pause-Symbol aussieht. Sie können mehrmals darauf klicken, um bei Fehlern nicht zu pausieren, bei nicht erfassten Fehlern und allen Fehlern anzuhalten. – HMR

Antwort

-3

So etwas sollte funktionieren:

var obj = { 
    name: 'obj', 
    fn: function() { 
    return 'hallo'; 
    } 
} 


function hasMethod(obj, fn) { 
    try { 
     if (!obj[fn]) { 
      var err = obj.name + ' does not have a method ' + fn; 
      throw new Error(err) 
     } 
    } catch (e) { 
     console.log(e) 
    } 
} 

hasMethod(obj, 'moose'); // obj does not have a method moose 

Fiddle

+5

Doenst Arbeit .http: //i.stack.imgur.com/c5QeV.png~http: //jsbin.com/unonEfI/2/edit –

+0

lol, vergessen, es in einem Browser zu testen . Es funktioniert in Node.js – olleicua

4

ich eine try...catch und throw Ihre eigenen Fehlermeldungen verwenden würde, Die Nachricht ist vom Browser abhängig. Ohne Änderungen außer chrome erhalten Sie eine schönere Nachricht, die den Typ des Objekts, das Sie verwendet haben, meldet.

+0

ja. Meine eigenen Fehlermeldungen zu werfen ist eine Möglichkeit. Ich war auf der Suche nach einer Lösung ohne try/catchs, also funktioniert es für Fehlermeldungen überall im Code, die ich nicht zu –

+0

Dies ist die einzige Lösung, die ich mir vorstellen kann. Ansonsten brauchen wir eine Möglichkeit, die Fehlerklasse selbst zu modifizieren. –

1

The:

Object.prototype.toString = function() { 
    return '(OBJECT: ' + this.name + ')'; 
}; 

foo = { name: 'foo' }; 
bar = { name: 'bar' }; 
baz = {} 

foo.thing(); // TypeError: Object (OBJECT: foo) has no method 'thing' 
bar.thing(); // TypeError: Object (OBJECT: bar) has no method 'thing' 
baz.thing(); // TypeError: Object (OBJECT: undefined) has no method 'thing' 

(Knoten js)

1

Dies ist eine Einschränkung der Object.prototype.toString-Methode, die anscheinend für die Erstellung der [object Object]-Notation verantwortlich ist, die Sie in diesen TypeErrors sehen. Obwohl Sie den toString Prototyp für die Object global außer Kraft setzen kann, ist der überschriebenen Prototyp nicht das, was durch den nativen Code in TypeErrors und dergleichen genannt endet immer.

Here's a bit more explanation for why that specific notation was chosen und hier ist why it can't be overridden. Effektiv ist dieses Format der Fehlermeldung mehr Teil des Javascript-Compilers und/oder der Implementierung als ein Teil von Javascript selbst!

0

Wenn Ihr Ziel ist klar JavaScript-Objekt zu bespannen

dann
JSON.stringify(object) 

Werke absolut großartig zu konvertieren. Dokumentation dafür ist here.

Aber ich sehe "toggle" in der Fehlermeldung, die Sie erwähnt haben, ich nehme an, es ist allgemein JQuery toggle, die auf DOM-Objekte durchgeführt wird. In diesem Fall funktioniert JSON.stringify() nicht.

Um zu String zu konvertieren DOM-Objekt this stackoverflow post

+0

Was ist, wenn Objekt Methoden hat? Wird es mit stringify angezeigt? – everlasto

0

Vielleicht folgen Sie auch Object.toSource() versuchen können (Ich denke, es nur in Firefox funktioniert)