Mat*_*ann 95 try-catch typescript
我有以下代码:
try {
  phpDoc(vscode.window.activeTextEditor);
} catch (err) {
  console.error(err);
  vscode.window.showErrorMessage(err.message);
}
但是在 上err.message出现错误,但我无法在 中键入对象。Object is of type 'unknown'.ts(2571)err.catch (err: Error)
我应该怎么办?
Ole*_*ter 94
作为对certainPerformance的补充答案:
在 TypeScript 4.0 之前,catch子句绑定被设置为允许any轻松访问属性message。这是不安全的,因为不能保证抛出的内容将从Error原型继承 - 只是作为最佳实践,我们不会抛出除错误之外的任何内容:
(() => {
    try {
        const myErr = { code: 42, reason: "the answer" };
        throw myErr; //don't do that in real life
    } catch(err) {
        console.log(err.message); //undefined
    }
})();
TypeScript 4.0引入了更安全子句的选项catch,允许您将参数注释为unknown,强制您执行显式类型断言,或者更好的是进行类型保护(这使得该子句既是编译时安全的,也是运行时安全的)。
但是,为了避免破坏大多数代码库,您必须明确选择新行为:
(() => {
    try {
        throw new Error("ouch!");
    } catch(err: unknown) {
        console.log(err.message); //Object is of type 'unknown'
    }
})();
TypeScript 4.4 引入了一个新的编译器选项,useUnknownInCatchVariables该选项强制执行此行为。false默认情况下是这样,但如果您strict打开了该选项(您应该这样做),它就会打开,这很可能是您首先收到错误的原因。
小智 63
如果您不想在升级 TypeScript 后更改所有代码,但处于严格模式,则可以在strict覆盖它的选项之后添加以下编译器选项,如Oleg 的答案中所暗示的:
tsconfig.json
{
  "compilerOptions": {
    [...]
    "strict": true,
    "useUnknownInCatchVariables": false,
    [...]
    },
  },
}
"strict": true,设置useUnknownInCatchVariables为 true,然后"useUnknownInCatchVariables": false,覆盖它并将其设置回 false。
Cer*_*nce 53
因为任何东西都可以扔,所以unknown。
const fn = () => {
  throw 'foo';
};
try {
  fn();
} catch(e) {
  console.log(e);
  console.log(e instanceof Error);
  console.log(e === 'foo');
}在访问该属性之前,您需要检查是否err确实存在错误以缩小范围message。
try {
  phpDoc(vscode.window.activeTextEditor);
} catch (err) {
  console.error(err);
  if (err instanceof Error) {
    vscode.window.showErrorMessage(err.message);
  } else {
    // do something else with what was thrown, maybe?
    // vscode.window.showErrorMessage(String(err));
  }
}
您不能在打字稿中为 catch 子句变量编写特定的注释,这是因为在 javascript 中,catch 子句将捕获引发的任何异常,而不仅仅是指定类型的异常。
在打字稿中,如果您只想捕获特定类型的异常,则必须捕获抛出的任何内容,检查它是否是您想要处理的异常类型,如果不是,则再次抛出它。
含义:在执行任何操作之前,请先确保引发的错误是 axios 错误。
使用类型断言
使用 AxiosError 来转换错误
import  { AxiosError } from 'axios';
try {
    // do some api fetch
    } catch (error) {
    const err = error as AxiosError
    // console.log(err.response?.data)
    if (!err?.response) {
        console.log("No Server Response");
    } else if (err.response?.status === 400) {
        console.log("Missing Username or Password");
    } else {
        console.log("Login Failed");
    }  
}
在执行任何操作之前,请先检查错误是否为 axios 错误
import axios from "axios"
try {
    // do something
} catch (err) {
    // check if the error is an axios error
    if (axios.isAxiosError(err)) {
        // console.log(err.response?.data)
        if (!err?.response) {
            console.log("No Server Response");
        } else if (err.response?.status === 400) {
            console.log("Missing Username or Password");
        } else {
            console.log("Login Failed");
        } 
    } 
}
| 归档时间: | 
 | 
| 查看次数: | 68984 次 | 
| 最近记录: |