Re: Fehlerbehandlung



Andreas Born wrote:

> Thomas 'PointedEars' Lahn wrote:
>> Andreas Born wrote:
>>> Ich würde gerne Scriptfehler auffangen und die information an den
>>> Webserver weiterleiten.
>> Grundsätzlich halte ich Deinen Ansatz für verkehrt. Fehler im
>> clientseitigen Script-Code sollten sich beim Test und nachher
>> bei der Verwendung, mithin beim Client, manifestieren -- oder
>> eben durch sinnvolle Programmierung gar nicht erst auftreten.
>
> Das wird natürlich angestrebt. :)
> Allerdings handelt es sich nicht um in statische HTML-Seiten
> eingebetteten Scriptcode, sondern um ein Addon, welches z.B. mittels
> Firefox-Plugin in verschiedene Internetseiten nachträglich eingefügt
> wird.

Sag^W Schreib das doch gleich. Das relativiert womöglich einige meiner
Aussagen.

> Da sich der Aufbau dieser Seiten natürlich ändern kann, will ich mir
> entsprechende Fehler melden lassen, um daraufhin schnellstmöglich
> reagieren zu können.

Das verstehe ich nicht. Kannst Du konkreter werden?

>>> Das Weiterleiten funktioniert bereits,
>> Das mag ich bedreifeln. Es funktioniert vielleicht in bestimmten
>> Fällen.
>
> Was meinst Du genau?

Zu einer genauen Aussage fehlt mir wesentliche Information zum Code.

> Ich habe eine Fehlerroutine, die im hoffentlich selten auftretenden
> Fehlerfall aufgerufen wird, und dynamisch ein dummy-image vom server
> nachlädt und hierbei die Daten url-kodiert überträgt. Serverseitig fängt
> ein php-skript die Anfrage ab und liefert das image zurück.

Wenn ein fataler Fehler auftritt, wird nichts weitergeleitet.
Aber ich kenne Design und Anwendungsfeld Deines Add-Ons nicht.

>>> ich bin aber unsicher ob es vernünftiger ist, mit try..catch zu
>>> arbeiten, oder mit window.onerror.
>>>
>>> Letzteres liefert mir zusätzlich zum Fehlertext die Zeilennummer,
>> Interessant, danach suche ich gerade. Kannst Du dafür mal ein
>> Beispiel geben?
>
> nicht wirklich, da das nur beim ie funktioniert.
> Der dritte Parameter der errorHandler-Funktion enthält dort die
> Zeilennummer.
>
> window.onerror = function(err, url, line) {
> alert(err + ' in line ' + line);
> }

Immerhin, dann werde ich das einbauen. Danke!

>> Ersteres liefert Dir dies per line-Eigenschaft des Error-Objekts auch.
>
> Ahja, das ist mir neu.
> Klappt aber nicht im IE. Das hat hier nur die Eigenschaften
> {name, message, number, description}.
>
> Beim Firefox habe ich
> {name, message, fileName, lineNumber, stack}.

Das erklärt die "Zeile: 0" in IE-Fehlermeldungen <eg/>

> [...]
> function objMyScript() {
> /* local vars, member vars, constructor instructions */
>
> function main() {
> alert('started');
> document.getElementById('not here').style.display = 'none';
> }
>
> /* Prototyping additions, e.g.: */
> if (typeof HTMLElement != 'undefined' &&
> !HTMLElement.prototype.getElementById) {

Hier gehst Du ohne Not davon aus, dass, wenn HTMLElement
existiert, auch HTMLElement.prototype existieren muss.

<URL:http://pointedears.de/scripts/test/whatami>

> HTMLElement.prototype.getElementById = function(id) {
> /* ... */
> }

Das ist IMHO Unfug. Das einzige DOM, welches derzeit DOM-Interfaces
als gleichnamige Konstruktoren bereitstellt, ist das Gecko-DOM, und da
wird Document::getElementById() bereits unterstützt. Sollten also
zukünftige Browserversionen, die derzeit noch nicht ersteres Feature
bieten, es in Zukunft bieten, so werden sie Document::getElementById()
unterstützen müssen, um konkurrenzfähig zu bleiben (derzeit IE 5.0+,
Opera 6.0+).

> }
> }
>
> if (typeof(myScript) == 'undefined') {
> var myScript = new objMyScript();
> }

Das ist auch nicht sehr sinnvoll. Vergleiche:

var myScript;
alert(typeof myScript); // undefined

> var oldErrorHandler = window.onerror;
> window.onerror = errorHandler;
>
> try {
> myScript.main();

Das funktioniert höchstens zufällig. Nicht `myScript' oder sein Prototyp
hat nämlich die Eigenschaft `main', sondern der Konstruktor selbst. Und
das auch nur in JavaScript, als Erweiterung zu ECMAScript. Du suchst
stattdessen:

objMyScript.main = function()
{
alert('started');
document.getElementById('not here').style.display = 'none';
}

Wenn Du das jetzt noch änderst in

objMyScript.prototype.main = function()
{
function isMethodType(s)
{
return (s == "function" || s == "object");
}

alert('started');

var t, o;
if (isMethodType(typeof document.getElementById)
&& (o = document.getElementById('not here'))
&& typeof o.style != "undefined"
&& typeof o.style.display != "undefined")
{
o.style.display = 'none';
}
}

löst sich die Notwendigkeit, hier Fehler-/Exception-Behandlung
zu betreiben, vermutlich in ein Logikwölkchen auf.

> } catch(except) {
> errorHandler(null, null, null, except);
> }
>
> window.onerror = oldErrorHandler;

Das ist so aber Unfug. Ich schrieb das eval() oben nicht umsonst.
Nur damit (auszuwertender Code im String-Literal) lässt sich nämlich
vermeiden, dass es zu einem Kompilierungs-Fehler kommt, wenn
Exception-Handling nicht unterstützt wird.

> Bei mir wird jedoch nach dem errorhandler kein weiterer Code mehr
> abgearbeitet:
>
> window.onerror = function(err) {
> alert('Fehler: ' + err);
> return true;
> }
> causeError();
> alert('Fehler wurde abgefangen');
>
> Die letzte alert-Anweisung wird bei mir nie ausgeführt.

Definiere: "bei mir"

> Irgendetwas ist mir dahingehend doch noch unklar.
> Wenn ich causeError(); in einen try..catch-block stecke, dann geht's
> natürlich, im Beispiel scheint die Kompilierung bei causeError(); jedoch
> abzubrechen.

Was tut causeError()? Ist so eine Methode überhaupt definiert?

>> Das Folgende funktioniert nachweislich mit und ohne Exception-Support.
>> Ob es auch vernünftig ist, hängt davon ab, wie es eingesetzt wird.
>>
>> window.onerror = function()
>> {
>> this.onerror = null;
>> return true;
>> };
>>
>> eval('try { ... } catch (e) { ... }');
>>
>> // ab hier führen alle Fehler wieder zum Abbruch (des Kontexts)
>> window.onerror();
>
> Danke, sieht sehr interessant aus!
> Damit könnte ich eine weiche für try und onerror schreiben...

Gern geschehen. Ja.


PointedEars
.



Relevant Pages

  • Re: Fehlerbehandlung
    ... function errorHandler{ ... function objMyScript() { ... var oldErrorHandler = window.onerror; ... Wenn ich causeError(); in einen try..catch-block stecke, ...
    (de.comp.lang.javascript)
  • Re: Fehlerbehandlung
    ... > Das eigentliche script wird durch das Plugin vom Server geladen (d.h. ... denn `myScript' existiert ja; ... Was auf unsaubere Programmierung hindeutet. ... > function objMyScript() { ...
    (de.comp.lang.javascript)