【问题标题】:How to do try catch and finally statements in TypeScript?如何在 TypeScript 中尝试 catch 和 finally 语句?
【发布时间】:2019-07-06 01:31:19
【问题描述】:

我的项目有错误,我需要使用 trycatchfinally 来处理。

我可以在 JavaScript 中使用它,但不能在 Typescript 中使用。

当我将 Exception 作为 typescript catch 语句中的参数时,为什么它不接受这个?

这里是代码。

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

我在这里需要一条异常消息,但我无法得到。我得到了以下错误。

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

【问题讨论】:

标签: typescript error-handling try-catch


【解决方案1】:

简单回答

catch (e) {
  const error = e as <Your custom error type>;
  ...
}

【讨论】:

    【解决方案2】:

    编辑

    Typescript 4.0 添加了在 catch 变量 (Issue) 上指定 unknownany 的功能,并且 typescript 4.4 添加了使 unknown 成为 catch 变量 (PR) 的默认值的功能@标志。

    使用此标志,现在可以进行以下操作:

    catch(e){
        result = e.message; // error under useUnknownInCatchVariables 
        if (typeof e === "string") {
            e.toUpperCase() // works, `e` narrowed to string
        } else if (e instanceof Error) {
            e.message // works, `e` narrowed to Error
        }
    }
    

    仍然不支持在 catch 变量上指定任意类型。

    原答案

    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 会有助于捕捉到这一点。

    【讨论】:

      【解决方案3】:

      我的情况是这样的。 打印到终端:

          catch(error){
            log('any_text', error as Error);
      }
      

      或调用方法:

          catch(error){
             anything_here((error as Error).message),
      }
      

      【讨论】:

      • 这几乎是一个合理的答案,但你应该把整个 try 块放在你的 sn-p 中,也许解释一下为什么这对你有用。
      【解决方案4】:

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

      unknownany 更安全,因为它提醒我们在操作我们的值之前需要执行某种类型检查。 (docs)

      try {  /* ... */ }
      catch (e: unknown) { // <-- note `e` has explicit `unknown` type
          e.message // errors
          if (typeof e === "string") {
              e.toUpperCase() // works, `e` narrowed to string
          } else if (e instanceof Error) {
              e.message // works, `e` narrowed to Error
          }
          // ... handle other error types 
      }
      

      Playground

      更新: TypeScript 4.4 提供了一个配置标志 --useUnknownInCatchVariables 让 catch-variables 默认类型为 unknown。这也通过--strict 标志自动启用。

      【讨论】:

        【解决方案5】:

        首先,你需要定义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;
        }
        

        【讨论】:

        • 我以为你已经创建了那种类型。否则没必要,登录econsole.log(e)看到什么
        猜你喜欢
        • 2014-04-19
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 2012-05-22
        相关资源
        最近更新 更多