【问题标题】:Why does a multi-function line of code not produce an error and simply halt execution?为什么多功能代码行不会产生错误而只是停止执行?
【发布时间】:2017-06-23 18:22:51
【问题描述】:

我知道下面这行代码是可怕的编码,但我的问题是为什么这种类型的代码不会产生控制台错误,而是简单地停止执行?

例子:

假设有一个名为mySessionItem的会话存储项,其值为JSON,其中包含属性myObjectProperty,当设置了会话存储项并具有有效的JSON时,执行以下代码将起作用。

let myVar = JSON.parse(sessionStorage.getItem("mySessionItem"))["myObjectProperty"] === "myValue" ? false : true; 

但是,如果会话存储未设置,或设置为无效 JSON,或有效 JSON 但缺少属性 myProperty,则会出错并暂停执行。

这是正常行为,也是我对如此糟糕的代码所期望的。但是,这不会产生控制台错误,因此很难追踪。

这是否有原因不会导致控制台错误,有什么方法可以强制它以编程方式生成一个,是否有任何简单的方法来追踪此类问题?

我在一个拥有不同编码能力水平的成员的大型团队中工作,当这样的事情进入代码库时,我想找到更好的方法来跟踪它们,因为它们在大型应用程序中可能非常难以捉摸,并且到处肆虐。

作为参考,我们的团队正在使用通过 Angular CLI 使用 TypeScript 实现的 Angular 2。我不确定这些事情中的任何一个是否在导致错误的错误代码中起作用,所以我想确保我强调了我们正在使用的工具。

【问题讨论】:

  • 控制台出现错误:VM140:1 Uncaught TypeError: Cannot read property 'myObjectProperty' of null at <anonymous>:1:64
  • 所以也许这与它在 Angular 2、TypeScript 等中有关?
  • 不是一个解决方案,但是如果你在它周围加上一个try ... catch,然后控制台记录错误,会发生什么?
  • @StephenRios 您是否偶然在可观察序列中有此代码?如果是这样,控制台在订阅函数的错误回调中记录错误。 rxjs .map() 方法会捕获错误并将其抛给错误回调(就像 try catch 一样)
  • 在该行放置一个断点。当它碰到它时,跨过它。它不会进入下一行,但可能会进入一些吞下异常的 Angular 代码。

标签: javascript angular typescript error-handling


【解决方案1】:

您可以在 Typescript 中为会话对象创建一个类,然后尝试访问该属性,因为该类将始终具有该属性。

> let myVar: boolean = new Session(JSON.parse(sessionStorage.getItem("mySessionItem"))).myObjectProperty === "myValue" ? false : true;

这使用了 Typescript 的一些类型安全特性,如果假设属性未设置或丢失,您可以控制构造函数中会话对象发生的情况。

constructor(options: { myObjectProperty?: string } = {}){
   this.myPropertyObject = options.myPropertyObject || '';
}

【讨论】:

  • 这绝对是保证单线安全的一种方法。我很欣赏关于如何使其更安全的意见。
猜你喜欢
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
相关资源
最近更新 更多