在修改前輩留下來的代碼時踩到一個坑。簡單講一下代碼作了什麼事:在 try/catch 裏實例化多個類,並調用類的方法爲其賦值,catch 到錯誤也不會中斷,而是經過打日誌的形式收集報錯信息。javascript
我須要在裏面新實例化一個類,有樣學樣,上來就是一頓copy改,但是新增的類的某個屬性老是不對,排查了半天才發現一個坑。java
class Point {
constructor(x, y) {
this.x = x
this.y = y
}
getX() {
return this.x
}
setX(x) {
this.x = x
}
}
let p, cat
try {
p = new Point(1, 2)
cat = new Cat('胖虎') // 這裏實例化了一個不存在的類,用來模擬報錯,實際狀況比這個複雜
p.setX(66) // 這一行應該寫在 `cat` 的前面,否則 `cat` 報錯後直接中斷下面語句的執行,致使這行語句沒有執行
} catch (e) {
console.log(e)
}
console.log(p.getX())
複製代碼
執行結果,x
沒有被賦值成66,拋出錯誤致使程序中斷,賦值語句沒有執行 ui
class Point {
constructor(x, y) {
this.x = x
this.y = y
}
getX() {
return this.x
}
setX(x) {
this.x = x
}
}
let p, cat
try {
p = new Point(1, 2)
p.setX(66) // 方法調用緊隨實例後面,不受下面代碼的影響
cat = new Cat('胖虎')
} catch (e) {
console.log(e)
}
console.log(p.getX())
複製代碼
執行結果,x
正確被賦值,錯誤也正常拋出 this