如何处理未明确抛出的方法或代码的错误?
将其包装为do/catch块会导致编译器警告:
"'catch' block is unreachable because no errors are thrown in 'do' block"
Run Code Online (Sandbox Code Playgroud)
来自C#/ JAVA背景,至少可以说这是一个奇怪的事.作为开发人员,我应该能够在do/catch块中保护和包装任何代码块.仅仅因为方法未明确标记为"throw"并不意味着不会发生错误.
我想使用连续的try语句.如果有人返回错误,我想继续下一个,否则返回值.下面的代码似乎工作正常,但我最终会得到一个大的嵌套do catch金字塔.在Swift 3.0中有更聪明/更好的方法吗?
do {
return try firstThing()
} catch {
do {
return try secondThing()
} catch {
return try thirdThing()
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个查询API的函数,然后根据结果填充对象数组(参见下面的代码).从检索到的JSON中我可以使用guard语句来捕获任何错误,这意味着如果数据丢失则会被捕获,但是如果URL不正确或者函数无法连接到URL,则会导致应用程序崩溃
let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
Run Code Online (Sandbox Code Playgroud)
并给出以下错误消息
2018-01-27 23:11:28.759466+0000 myPregnancy[6321:224887] TIC Read Status [1:0x6040001729c0]: 1:57
2018-01-27 23:11:28.759940+0000 myPregnancy[6321:224887] Task <05716AF1-B1E0-4EB8-ADC7-138C026C58AC>.<1> HTTP load failed (error code: -1005 [4:-4])
2018-01-27 23:11:28.760813+0000 myPregnancy[6321:224886] Task <05716AF1-B1E0-4EB8-ADC7-138C026C58AC>.<1> finished with error - code: -1005
Run Code Online (Sandbox Code Playgroud)
如何使用guard来捕获此错误并返回类似于我处理丢失数据的错误消息?
func loadMedication(){
print("Getting medication")
self.medication.removeAll()
let myUrl = URL(string: "URL HIDDEN");
var request = URLRequest(url:myUrl!)
request.httpMethod = "POST"// Compose a query string
let postString = "userToken=" + User.user.getUserId();
request.httpBody = postString.data(using: String.Encoding.utf8);
let …Run Code Online (Sandbox Code Playgroud) 我已经看到已经有一个关于 Swift和Swift 之间差异的问题,我知道这些差异。但是,我不理解下面代码片段的行为,因为它编译正确。Swift 的错误处理机制要求每个未出现在带有 throws 子句的函数中的 do-catch 块都包含一个通用处理程序(要么不包含任何其他内容,要么包含一个for Error)。然而,使用似乎具有相同的效果。这里有人知道原因吗?我在另一个问题中读到“任何符合 ErrorType 的类都可以转换为 NSError。这些功能在文档中进行了描述。”。然而,该答案指出的文档并没有向我澄清这一点,因为它重点关注我没有使用的 Objective-C。NSErrorErrorcatchcatchNSError
import Foundation
extension Int : Error {}
extension String : Error {}
func fErr() throws {
let a = Int(readLine()!)!
if a > 20 {
throw 42
} else {
throw "An error occurred"
}
}
func gErr() {
do {
try fErr()
} catch let e as NSError {
print(e)
}
}
Run Code Online (Sandbox Code Playgroud) 我一直想这样做:
do {
let result = try getAThing()
} catch {
//error
}
do {
let anotherResult = try getAnotherThing(result) //Error - result out of scope
} catch {
//error
}
Run Code Online (Sandbox Code Playgroud)
但似乎只能做到这一点:
do {
let result = try getAThing()
do {
let anotherResult = try getAnotherThing(result)
} catch {
//error
}
} catch {
//error
}
Run Code Online (Sandbox Code Playgroud)
有没有办法result在不必嵌套do/catch块的情况下保持不可变的范围?有没有办法防止错误类似于我们如何使用guard语句作为if/else块的反转?
我试图将代码从swift 2转换为swift 4,并遇到此错误
从这里抛出的错误不予处理
所以我这样做了,但是现在它告诉我返回一个字符串。任何想法如何做到这一点?
func formatSentence(sentence:String) -> String
{
do {
let regex = try NSRegularExpression(pattern: "\\W+", options: .caseInsensitive)
let modifiedString = regex.stringByReplacingMatches(in: sentence, options: [], range: NSRange(location: 0,length: sentence.count), withTemplate: "")
} catch {
print(error)
}
//I tried adding it here the return modifiedString but gives me error
}
Run Code Online (Sandbox Code Playgroud)
这就是原始功能的样子
func formatSentence(sentence:String) -> String
{
let regex = NSRegularExpression(pattern: "\\W+", options: .caseInsensitive)//NSRegularExpression(pattern:"\\W+", options: .CaseInsensitive, error: nil)
let modifiedString = regex.stringByReplacingMatches(in: sentence, options: [], range: NSRange(location: 0,length: sentence.count), withTemplate: …Run Code Online (Sandbox Code Playgroud)