下面我有一個main
函數。這個函數有許多其他變量聲明並運行許多函數。如果在函數內發生錯誤,我可以捕獲這個錯誤,但在我的捕獲中,我沒有main
函數的值。我正在尋找一種即使在引發錯誤時也能訪問所有變量的方法。即使在引發錯誤時訪問函數內的所有變量?
export async function main ({alpha, beta, gamma}) {
let one = await doSomething(alpha)
let two = await doSomethingElse(one, beta)
return {one, two}
}
export async function store (db) {
await db.insert(data)
}
export async function usage (db, data) {
try {
let operation = await main(data)
await store (db, operation)
return operation
} catch (e) {
// here we don't have access to operation variables :(
await store(db, {}, e.message)
throw e
}
}
唯一合理的方法我發現這樣做是爲了創建一個類,其中在main
函數的每個值。
import { get } from 'lodash'
export class Operation() {
constructor(db){
this.db = db
}
main({alpha, beta, gamma}) {
this.one = await doSomething(alpha)
this.two = await doSomethingElse(one, beta)
return {one: this.one, two: this.two}
}
init(data) {
try {
let main = await this.main(data)
await this.store(main)
return main
} catch (e) {
await this.store()
throw e
}
}
store(data = {}, errorMessage) {
if (!data.one) data.one = get(this, 'one') || null
if (!data.two) data.two = get(this, 'two') || null
if (errorMessage) data.errMessage = errorMessage
return await this.db.insert(data)
}
}
即使發生錯誤時,如何訪問函數中的所有變量?
您可能仍然希望'try'內的第一個'await',以防萬一失敗 - 只需在外部範圍聲明'operation' var。 – nrabinowitz
@nrabinowitz:不,我真的打算把第一個'await'放在內部'try'的外面,這樣異常/拒絕就會被外部'catch'塊捕獲。當然,皮膚貓有很多種方法,這可能或可能不是真正需要的。 – Bergi
@Bergi這個想法是,即使doSomethingElse拋出一個錯誤,我也想訪問'one'的值。 – ThomasReggi