我有一個執行異步任務的函式。有時該任務會失敗并引發錯誤。我無法從呼叫函式中捕獲該錯誤。下面的操場抓住了我遇到的麻煩的本質。
import UIKit
Task {
var newNum: Double = 99.9
do {
newNum = try await getMyNumber()
print("newNum within do: \(newNum)")
} catch MyErrors.BeingStupid { //never gets caught
print("caught being stupid")
} catch MyErrors.JustBecause { //does get caught if throw is uncommented
print("caught just because")
}
print("newNum outside of do \(newNum)")
}
print("done with main")
func getMyNumber() async throws -> Double {
let retNum:Double = 0
Task{
sleep(5)
let myNum: Double = Double.random(in: (0...10))
if myNum > 9 {
print("greater than 9")
} else {
print("less than 9 -- should throw")
throw MyErrors.BeingStupid // error doesn't get thrown? HOW DO I CATCH THIS?
}
}
// throw MyErrors.JustBecause // this *does* get caught if uncommented
return retNum //function always returns
}
enum MyErrors: Error {
case BeingStupid, JustBecause
}
如何捕獲在呼叫函式中注釋為“我如何捕獲它”的行中拋出的錯誤?
uj5u.com熱心網友回復:
Task用于非結構化并發。如果目的是模擬異步任務,我建議保留在結構化并發范圍內。因此,使用Task.sleep(nanoseconds:)代替sleep()并消除Taskwithin getMyNumber:
func getMyNumber() async throws -> Double {
try await Task.sleep(nanoseconds: 5 * NSEC_PER_SEC) // better simulation of some asynchronous process
let myNum = Double.random(in: 0...10)
if myNum > 9 {
print("greater than 9")
} else {
print("less than 9 -- should throw")
throw MyErrors.beingStupid
}
return myNum
}
enum MyErrors: Error {
case beingStupid, justBecause
}
如果您停留在結構化并發范圍內,則很容易發現拋出的錯誤。
有關結構化和非結構化并發之間區別的更多資訊,請參閱Swift 編程指南:并發或 WWDC 2021 視頻探索 Swift 中的結構化并發
以上說明了標準的結構化并發模式。如果你真的必須使用非結構化并發,你可以try awaitand Task,如果它沒有拋出錯誤,回傳它value,例如:
func getMyNumber() async throws -> Double {
let task = Task.detached {
sleep(5) // really bad idea ... never sleep ... especially never sleep on the main actor, which is why I used `Task.detached`
let myNum = Double.random(in: 0...10)
if myNum > 9 {
print("greater than 9")
} else {
print("less than 9 -- should throw")
throw MyErrors.beingStupid
}
return myNum
}
return try await task.value
}
請注意,因為我們正在運行緩慢且同步的東西,我們希望它在后臺執行緒上運行,因此使用Task.detached.
為了完整起見,我只包括這個非結構化并發示例。您很可能希望保持在結構化并發范圍內。這樣,您不僅可以享受更簡潔的實作,還可以享受取消的自動傳播等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513486.html
標籤:迅速异步异步等待扔
