Anwendung von try{...}catch{...} in Adobe InDesign Skripten

Die richtige Fehlerbehandlung in Skripten ist eine der wichtigsten Aufgaben der Skriptprogrammierung, hier sollen die allgemeine Fehlerbehandlung in JavaScript und die spezielle Fehlerbehandlung mit Adobe InDesign Scripting behandelt werden.
(ErrorHandling with Adobe InDesign Scripting)
Antworten
sup
Administrator
Beiträge: 4
Registriert: 6. Aug 2011, 10:46
Wohnort: 18374 Zingst

Anwendung von try{...}catch{...} in Adobe InDesign Skripten

Beitrag von sup » 10. Aug 2013, 12:16

Mit try{...}catch{...} können Sie schon bei der Skripterstellung verhindern, dass Ihr Skript beim Auftreten eines Fehlers unkontrolliert abgebrochen wird.

Schreiben Sie in dem Try-Zweig den auszuführenden Programmcode. Sollte bei der Ausführung dieses Programmteiles ein unerwarteter Fehler auftreten, wird das Skript unterbrochen und ein Fehlerobjekt an den Catch-Zweig übergeben.
Im Catch-Zweig können Sie dann entscheiden, ob der aufgetretende Fehler durch Ihr Skript korrigiert werden kann oder oder abgebrochen werden muss.

Beispiel:
Ihr Skript soll den vollständigen Namen der geöffneten InDesign-Datei in einem Meldungsfenster ausgeben.
Sie müssten also eigentlich zuerst einmal überprüfen, ob überhaupt eine Datei geöffnet ist, wenn ja, ob Sie schon jemals gespeichert wurde, bevor Sie den Namen abfragen können. Ohne try{...}catch{} müssten Sie in etwa so vorgehen:

Code: Alles auswählen

#target indesign
// Skripte immer über eine Main-Funktion rufen,
// um die Variablen für andere Skripte unsichtbar zu machen
main()

/*void*/function main()
{
    if (app.documents.length>0) 
    {
        if (app.activeDocument.saved)
            alert(app.activeDocument.fullName);
        else
            alert("Kann keinen Namen ermitteln, weil die Datei noch nicht gespeichert wurde!");
    }
    else
    {
        alert("keine Datei geöffnet!");
    } 
    return ;
}
Und jetzt das Skript mit Try{...}catch{...}:

Code: Alles auswählen

#target indesign
// Skripte immer über eine Main-Funktion rufen,
// um die Variablen für andere Skripte unsichtbar zu machen
main()

/*void*/function main()
{
    try
    {
        alert(app.activeDocument.fullName);
    }
    catch (error)
    {
        alert(error.message);
    }
    return ;
}
Noch schöner wäre es sicherlich, wenn in den Fehlerfällen Keine Datei geöffnet oder Datei wurde noch nicht gespeichert, der Anwender zum Nachbessern aufgefordert wird:

Code: Alles auswählen

#target indesign
// Skripte immer über eine Main-Funktion rufen,
// um die Variablen für andere Skripte unsichtbar zu machen
main()

/*void*/function main()
{
    try
    {
        alert(app.activeDocument.fullName);
    }
    catch (error)
    {
        try
        {
            if (error.number == 90938)
            {
                var file = File().saveDlg("Bitte Datei speichern:")
                if (file == null)
                    throw new Error("Abbruch durch Anwender!");
                app.activeDocument.save(file);
                return main();
            }   
            else if (error.number == 90884)
            {
                var file = File().openDlg("Bitte Datei öffnen:")
                if (file == null)
                    throw new Error("Abbruch durch Anwender!");
                app.open(file);
                return main();
            }
            throw error;
        }
        catch (error)
        {
            // alle anderen möglichen Fehler enden hier!! 
            alert(error.message+ "\n" + error.number);
        }
    }
    return ;
}
Mit Try{...}Catch{...} stehen bei Skript-Programmierung sehr flexible Möglichkeiten der Fehlerbehandlung zur Verfügung.

Probieren Sie die Beispiele einfach mal mit keiner geöffneten Datei, einer neuen Datei, einer gespeicherten Datei und einer geöffneten IDML-Datei aus.

Was Sie allerdings niemals machen sollten:

Code: Alles auswählen

try
{
    Ihr Programmcode
}
catch ()
{}
Da bedeutet so viel wie:
Versuchs mal, wenn's klappt, ist's gut, wenn nicht, mach weiter ohne Rücksicht auf Verluste! ;-)
So etwas kann sich zum Alptraum entwickeln, denn ein unterdrückter Fehler ist äußerst schwer zu finden!

Antworten

Zurück zu „InDesign Script Programming - Errorhandling“