[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Fragen zum Error-Objekt und zu throw

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Fragen zum Error-Objekt und zu throw

mdomino
Beiträge gesamt: 76

8. Nov 2015, 22:25
Beitrag # 1 von 6
Bewertung:
(2163 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo liebe Scripter!

Ich versuche gerade in meinem Script zu Debugging-Zwecken eigene Fehler „zu werfen“ und entweder verstehe dabei nicht ganz, wie das Error-Objekt funktioniert oder das Error-Objekt hat einen Bug.

Zunächst zum von InDesign erstellen Error-Objekt bei Laufzeitfehlern. Angeblich hat das Error-Objekt eine property namens „description“ und drei Parameter namens „msg“, „file“ und „line“. Dann habe ich irgendwoher noch die property namens „message“, die im Objektmodell aber nicht genannt wird.

Produziere ich jetzt einen Laufzeitfehler und fange diesen in einem catch auf und gebe mal die ganzen Sachen per alert aus, habe ich folgende Ergebnisse:

Code
try { 
app.pages = 2; // Laufzeitfehler
} catch (err) {
alert(err); // Fehler: Objekt unterstützt Eigenschaft oder Methode pages nicht
alert(err.description); // Objekt unterstützt Eigenschaft oder Methode pages nicht
alert(err.message); // Objekt unterstützt Eigenschaft oder Methode pages nicht
alert(err.msg); // undefined
alert(err.file); // undefined
alert(err.line); // 2
}


Was mich hier vor allem wundert: Warum sind „msg“ und „file“ undefined, wohingegen „line“ ausgefüllt ist? Wie schafft man es hier, dass auch „file“ ausgefüllt wird?

Dann meine nächste große Frage: Wie „werfe“ ich einen eigenen Fehler mittels throw? Also was ist der korrekte Weg?

Ich habe Folgendes versucht und komme dabei zum gleichen Ergebnis wie vorhin:

Code
var produceError = function (truth) { 
if(truth) {
throw new Error ("I'm an intentional error.");
}
};

try {
produceError(true);
} catch (err) {
alert(err); // Fehler: I'm an intentional error.
alert(err.description); // I'm an intentional error.
alert(err.message); // I'm an intentional error.
alert(err.msg); // undefined
alert(err.file); // undefined
alert(err.line); // 3
}


Worauf ich letztendlich hinausmöchte ist folgendes: Ich möchte gerne, dass sowohl reguläre Laufzeit-Errors, als auch Errors, die ich selber mit throw erzeuge in der gleichen try/catch-Anweisung in meiner Hauptfunktion abgefangen werden und mir dann in der catch-Anweisung sinnvoll per alert() angezeigt werden, jeweils mit Fehlermeldung, Scriptdatei und Zeile.

Dazu könnte ich folgende alert-Anweisung schreiben:

Code
alert("Error\n" + err.description + "\nFile: " + err.file + "\nLine: " + err.line); 


Allerdings wird da bei err.file jeweils die Script-Datei nicht angezeigt, egal ob bei Laufzeit-Fehlern oder eigenen Fehlern, was bei mir aber wichtig wäre, da ich mit vielen #include-Dateien arbeite.

Wenn ich einen eigenen Fehler produziere könnte ich auch Folgendes mache, ich könnte throw ein Objekt übergeben:

Code
throw { 
description: "I'm an intentional error",
file: $.file,
line: $.line // line könnte ich wohl auch weglassen
}


Wenn ich das mache, dann wird meine Error-Alert-Message korrekt ausgefüllt. Aber ist das der richtige Weg mit throw ein Error-Objekt zu produzieren? Und bei einem Laufzeit-Error wäre der file-Teil meiner Alert-Message immer noch unausgefüllt mit "undefined", wie kann ich das beheben?

Vielen Dank im Voraus und viele Grüße,
MD
X

Fragen zum Error-Objekt und zu throw

mdomino
Beiträge gesamt: 76

9. Nov 2015, 01:25
Beitrag # 2 von 6
Beitrag ID: #544335
Bewertung:
(2115 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich habe ein bisschen weitergestöbert und vermute jetzt, dass es sich bei dem "file"-Parameter um einen Fehler in Adobes Dokumentation des Objektmodells handelt. Gebe ich nämlich bei einem Laufzeitfehler

Code
alert(e.fileName) 


aus, dann zeigt er mir den Dateinamen an. Ich gehe also davon aus, dass der eigentliche Parameter „fileName“ schlicht falsch als „file“ dokumentiert wurde. Genauso gehe ich davon aus, dass der angebliche Parameter „msg“ eigentlich „message“ heißt.

Siehe z.B. hier (wobei die Infos natürlich direkt von Adobe übernommen sind): http://www.indesignjs.de/extendscriptAPI/indesign8/#Error.html

Das heißt, ich werfe einen Fehler schlicht

Code
throw new Error("Ich bin ein Fehler!") 


und kann ihn dann folgendermaßen ausgeben:

Code
alert("Error\nMessage: " + e.message + "\nFile: " + e.fileName + "\nLine: " + e.line); 


– was ihr wahrscheinlich alle schon wusstet. ;)

Da hat mich das Objektmodell unnötig verwirrt.

Viele Grüße,
MD


als Antwort auf: [#544333]

Fragen zum Error-Objekt und zu throw

mdomino
Beiträge gesamt: 76

9. Nov 2015, 02:37
Beitrag # 3 von 6
Beitrag ID: #544337
Bewertung:
(2104 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
So, mein Selbstgespräch geht in die nächste Runde.

Ich habe bei Marc Autret jetzt noch diese sehr interessanten Ausführungen gefunden, wo er zeigt, wie man sein eigenes Error-Objekt konstruieren kann: http://www.indiscripts.com/...rum-roundup-5#hd2sb1

Er schlägt folgenden Code vor:

Code
// No need to use the native Error class 
//--------------------------------------

function MyException(msg,s)
{
this.message = msg || '';
this.name = s || 'Error';
this.stack = null;
};

MyException.prototype.toString = function()
{
// Hook $.stack *on first invocation*
// ---
this.stack || (this.stack = $.stack.
replace(/[\r\n]toString\(\)[\r\n]$/,'').
split(/[\r\n]/)
);

// Make toString() ECMA-262 compliant
// ---
return this.name + ': ' + this.message;
};


// =================
// Example code
// =================

function inner()
{
throw new MyException("Something's gone wrong!");
}

function outer()
{
inner();
}

function main()
{
try{ outer(); }
catch(e)
{
alert( e ); // => Error: Something's gone wrong!
alert( e.stack ); // => [myScript.jsx],main(),outer(),inner()
}
}

main();


Wenn ich das jetzt wie oben dargestellt per throw aufrufe, dann habe ich allerdings tatsächlich keine Resultate mehr bei e.fileName und e.line, was ja auch nachvollziehbar ist.

Wie kann ich aber diese Funktionalität wieder einbauen?
Ich habe versucht in Zeile 9 (also direkt unter "this.stack = null;") ein

Code
this.line = $.line 


einzubauen, aber wenn ich das als Fehler auslöse, dann wird mir immer nur "9" als Zeile ausgegeben und nicht die Zeile, in der der Fehler eigentlich ausgelöst wurde.

Gibt es da eine Möglichkeit, das direkt in die Funktion einzubauen, ohne dass ich das in die Funktionsparameter aufnehmen muss und dann jedesmal manuell $.line in die Funktionsparameter reinschreiben müsste?

Vielen Dank und viele Grüße,
MD


als Antwort auf: [#544335]
(Dieser Beitrag wurde von mdomino am 9. Nov 2015, 02:46 geändert)

Fragen zum Error-Objekt und zu throw

WernerPerplies
Beiträge gesamt: 2763

9. Nov 2015, 06:10
Beitrag # 4 von 6
Beitrag ID: #544338
Bewertung:
(2048 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Tag MD,

die meisten Fragen hast Du Dir ja selbst beantwortet, dennoch einen weiteren Link:

InDesign Script Programming - Errorhandling


als Antwort auf: [#544337]

Fragen zum Error-Objekt und zu throw

mdomino
Beiträge gesamt: 76

12. Nov 2015, 02:50
Beitrag # 5 von 6
Beitrag ID: #544442
Bewertung:
(1837 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner,

vielen Dank abermals für deine Antwort. Hat ein bisschen länger gedauert, bis ich mir das ansehen konnte und ist auch definitiv ein bisschen komplizierter zu durchschauen, das Error-Handler-Script für mich als Nicht-Profi, aber ich glaube nach einigem Rumrätseln und Rumprobieren, werde ich tatsächlich halbwegs schlau aus der Datei. ;)

Dankeschön!

MD


als Antwort auf: [#544338]

Fragen zum Error-Objekt und zu throw

WernerPerplies
Beiträge gesamt: 2763

12. Nov 2015, 06:03
Beitrag # 6 von 6
Beitrag ID: #544443
Bewertung:
(1807 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo MD,

Zitat ... und ist auch definitiv ein bisschen komplizierter zu durchschauen, das Error-Handler-Script für mich als Nicht-Profi, aber ich glaube nach einigem Rumrätseln und Rumprobieren, werde ich tatsächlich halbwegs schlau aus der Datei. ;)


Oh, ist ja eigentlich auch zum Einbinden (#include!) und benutzen gedacht und dann eher zur Fehleranalyse:

Welches Betriebssystem wird benutzt?
Welche Indesign-Version?
Wo ist der Fehler aufgerufen?
Wie sieht der Stack aus?
Welche Parameter wurden verwendet?
Wo ist der Fehler aufgetreten?


als Antwort auf: [#544442]
X

Aktuell

InDesign / Illustrator
MTT_300x300_11_2022

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
14.05.2024

Online
Dienstag, 14. Mai 2024, 10.00 - 10.30 Uhr

Webinar

Prozessoptimierung ist ein Teamsport! Keine Software und keine Maschine allein kann Ihnen helfen, die Effizienzpotenziale Ihres Betriebes maximal auszuschöpfen. Von der Auftragsannahme über die Vorstufe und den Druck bis hin zur Weiterverarbeitung – alles muss optimal ineinandergreifen. Apropos Weiterverarbeitung – in vielen Druckbetrieben fristet sie in Sachen Prozessoptimierung immer noch ein Schattendasein. Dabei liegen hier mittlerweile die größten Einsparpotenziale! In einem Webinar von Horizon und Impressed erfahren Sie, wie Sie diese Einsparungen realisieren können. Horizon, bekannt für innovative Lösungen in der Druckweiterverarbeitung, bietet mit iCE LiNK eine Workflowlösung für die Weiterverarbeitung. iCE LiNK überwacht, visualisiert und analysiert Produktionsabläufe und unterstützt bei der Wartung – damit immer alles reibungslos läuft. Den gleichen Anspruch hat der von Impressed entwickelte Impressed Workflow Server – er ist die smarte PDF-Workflow-Lösung für Druckereien, die Datenmanagement, Preflight und Produktionssteuerung übernimmt. Im Webinar zeigen Ihnen die Experten von Horizon und Impressed, wie beide Lösungen im Team die Effizienz und Produktivität Ihres Betriebes steigern können. Melden Sie sich am besten gleich an, wir freuen uns auf Sie! PS: Melden Sie sich in jedem Fall an – sollten Sie zum Termin verhindert sein, erhalten Sie die Aufzeichnung.

kostenlos

Ja

Organisator: Impressed / Horizon

https://www.impressed.de/schulung.php?c=sDetail&sid=327

Einsparpotenziale in der Weiterverarbeitung
Veranstaltungen
16.05.2024

Online
Donnerstag, 16. Mai 2024, 10.00 - 10.30 Uhr

Webinar

Komplizierte, kleinteilige Aufträge; alles sehr speziell; seit Jahren bewährte Prozesse – da können wir nichts standardisieren und automatisieren! Das sagen viele Großformatdrucker – aber stimmt das wirklich, ist dem tatsächlich so? Günther Business Solutions und Impressed treten in einem Webinar den Gegenbeweis an. Experten beider Unternehmen zeigen, wie Großformatdrucker vom Einsatz zweier bewährter Lösungen profitieren können: • von advanter print+sign von Günther Business Solutions, dem ERP-System für den Großformatdruck, dass alle Phasen der Wertschöpfung im Large Format Printing abdeckt • von Impressed Workflow Server, der smarten PDF-Workflow-Lösung für Druckereien, die Datenmanagement, Preflight und Produktionssteuerung übernimmt Über die Kombination beider Lösungen können Großformatdrucker ihre Prozesse mit modernen Workflows Schritt für Schritt automatisieren – und so zügig deutliche Zeit- und Kosteneinsparungen realisieren. Das Webinar sollten Sie sich nicht entgehen lassen – damit Sie keine Effizienzpotenziale mehr liegen lassen. Melden Sie sich am besten gleich an, wir freuen uns auf Sie! PS: Melden Sie sich in jedem Fall an – sollten Sie zum Termin verhindert sein, erhalten Sie die Aufzeichnung.

kostenlos

Nein

Organisator: Impressed / Günther Business Solutions

https://www.impressed.de/schulung.php?c=sDetail&sid=326

Und es geht doch: Automatisierung im Großformatdruck!