2

Ist es möglich/üblich, Ausnahmen (Cause) in TypeScript zu verschachteln, wie in Java?Ausnahmeverschachtelung/-umbruch in TypeScript

try { 
    // do something 
} catch (e) { 
    throw new MyException("Exception while doing something", e); 
} 

ich meine, es ist wahrscheinlich kein Problem, nur für MyException eine benutzerdefinierte Ctor haben, wie cause im e arg zu passieren, aber was ist die Berichterstattung (Druck) der Stapel später auf Spuren?

+1

Das Problem ist, dass Sie nicht wissen, was die Art von "e" ist. In Javascript können Sie alles "werfen": Zahlen, Strings, Fehler, Arrays, usw. Aber was Sie in Ihrem Code getan haben, ist völlig in Ordnung. Ich habe ein Feature für [throws clause und typed catch clause] (https://github.com/Microsoft/TypeScript/issues/13219) angefordert, das es (meiner Meinung nach) einfacher macht –

+0

Danke. Upvoted. Was wäre, wenn Sie eine Laufzeitprüfung durchführen könnten, wenn "e" eine Ausnahme ist und Sie dann in der Lage sein müssen, ihre Stack-Trace für das Reporting/Drucken später zu extrahieren (a'la 'printStackTrace')? Gibt es ein solches Muster/Code? – KarolDepka

+0

@KarolDepka 'console.log (e instanceof Fehler, e.stack);' – Thomas

Antwort

1

Wenn Sie sich für den Stack-Trace suchen, dann können Sie dies tun:

function normalizeError(e: any): Error { 
    if (e instanceof Error) { 
     return e; 
    } 

    return new Error(typeof e === "string" ? e : e.toString()); 
} 

Und dann:

try { 
    throw [1, "string", true]; 
} 
catch (e) { 
    e = normalizeError(e); 
    console.log(e.stack); 
} 

die so etwas wie gedruckt wird:

Error: 1,string,true
at normalizeError (:5:12)
at :11:9

Wenn Sie zielen auf es6, dann können Sie die Klasse Error statt t erweitern seine normalizeError Funktion, aber wenn Sie nicht zielen können es6 dann sollten Sie vermeiden, native Klassen zu erweitern.