如何在TypeScript中尝试catch和finally语句?

时间:2019-02-12 11:47:20

标签: typescript error-handling try-catch

我的项目中有错误,我需要使用 try catch finally 处理。我可以在JavaScript中使用它,但不能在Typescript中使用它。当我在打字稿 catch 语句中将 Exception 作为自变量时,这是不接受的?这是代码。

    private handling(argument: string): string {
    try {
        result= this.markLibrary(argument);
    }
    catch(e:Exception){
        result = e.Message;
    }
    return result;
}

我在这里需要一条异常消息,但我听不到。我收到以下错误。

  

Catch子句变量不能具有类型注释。

3 个答案:

答案 0 :(得分:3)

使用TS 4.0,可以将unknown设置为catch子句变量类型:

unknownany安全,因为它提醒我们在对值进行运算之前,我们需要执行某种类型检查。 (docs

try {  /* ... */ }
catch (e: unknown) { // <-- set `e` to `unknown` here
    e.message // errors
    if (typeof e === "string") {
        e.toUpperCase() // we now know, `e` is a string
    } else if (e instanceof Error) {
        e.message // works, `e` narrowed to Error
    }
    // ... handle other error types 
}

Try it out in the Playground

答案 1 :(得分:1)

Typescript不支持catch变量上的注释。有一个建议可以允许这样做,但仍在讨论中(请参阅here

您唯一的解决方案是使用类型断言或额外的变量

catch(_e){
    let e:Error= _e;
    result = e.message;
}

catch(e){
    result = (e as Error).message;
}

不幸的是,这也可以正常工作,并且完全没有被选中:

catch(e){
    result = e.MessageUps;
}

注意

正如您在提案讨论中所读到的那样,在JS中,并非所有抛出的内容都必须是Error实例,所以请提防这一假设

也许用no-unsafe-any的tslint可以帮助抓住这一点。

答案 2 :(得分:0)

首先,您需要定义result变量

let result;

第二,您无法定义e的类型-如消息所述,因此,如果要强制使用e的类型,请使用

catch(e){
    result = (e as Exception).Message;
}

catch(e){
    result = (<Exception>e).Message;
}

否则,它应该仍然有效,因为e的类型将为any

catch (e) {
    result = e.Message;
}