try、try?、try

Swift中try、try?和try!的异常处理

“try”需要用“ do catch”捕捉异常,如果在“try”代码块中出现异常,程序会跳转到相应的“catch”代码块中执行异常处理逻辑,然后继续执行“catch”代码块后面的代码。

enum NormalError: Error {
    case one
    case two
    case three
    case four
}

func someFunction(words: String) throws -> String {
    switch words {
    case "one":
        throw NormalError.one
    case "two":
        throw NormalError.one
    case "three":
        throw NormalError.one
    case "four":
        throw NormalError.one
    default:
        return "ok"
    }
}
//如果在“try”代码块中出现异常,程序会跳转到“catch”代码块中执行异常处理逻辑。
do {  
    try someFunction(words: "five")  
} catch {  
    print("An error occurred: \(error)")  
}

 “try?”是返回一个可选值类型,如果“try?”代码块中出现异常,返回值会是“nil”,否则返回可选值。可以在运行时判断是否有异常发生。

// 返回值是一个可选类型,如果执行正常的话就存在返回值,否则如果抛出错误的话返回值为nil
let result = try? say(words: "four")
// 可选绑定
if let res = try? doSomething(words: "four") {
}
else {  print("出现错误")  }
// 提前退出
guard let resu = try? say(words: "four") else { return }

 “try!”类似于可选型中的强制解包,它不会对错误进行处理,如果“try!”代码块中出现异常,程序会在异常发生处崩溃。

let result = try! someFunction()  
print("The result is \(result)")
print(try? divide(2,1))//divide 整数除法运算符(/)
// Optional(2.0)
print(try? divide(2,0))
// nil
print(try! divide(2,1))
// 2.0
print(try! divide(2,0))
// 崩溃

 

<think> 我们被要求回答关于try报错处理的含义和相关知识。根据用户提供的引用,我们可以整合信息如下: 引用[1]提到异常以同步方式传递,可以被调用者的try/catch捕获,否则可能导致程序崩溃。 引用[2]展示了使用try...except...在循环中处理用户输入错误的情况。 引用[4]展示了文件操作中使用try...except...finally...来确保文件关闭。 因此,我们可以将回答结构化为: 1. try语句的含义:用于捕获和处理异常,避免程序崩溃。 2. 基本结构:try...except, try...except...else, try...finally, 以及完整的try...except...else...finally。 3. 异常处理流程:当try块中的代码引发异常时,会跳转到匹配的except块;如果没有异常,则执行else块(如果有);finally块无论是否发生异常都会执行。 4. 应用场景:如用户输入验证(引用[2])、资源清理(如文件关闭,引用[4])等。 同时,按照要求,我们需要生成相关问题。 注意:引用[3]的内容关于路径处理,与try报错处理关系不大,可以忽略。 </think> ### try 报错处理的含义与相关知识 `try` 报错处理是编程中用于**捕获并处理运行时错误**的机制。其核心思想是:将可能引发错误的代码放入 `try` 块中,并预设对应的错误处理逻辑(`except` 块)。当 `try` 块中的代码抛出异常时,程序不会崩溃,而是跳转到匹配的 `except` 块执行修复操作,保证程序健壮性[^1][^2]。 #### 一、基本语法与流程 ```python try: # 可能引发异常的代码 risky_operation() except ErrorType: # 捕获特定错误 # 异常处理逻辑 handle_error() else: # 未发生异常时执行(可选) continue_normal() finally: # 无论是否异常都会执行(通常用于资源清理) cleanup_resources() ``` **执行流程**: 1. 执行 `try` 块代码 → 2. 若发生错误 → 匹配 `except` 块处理 → 执行 `finally` 块(若有) 3. 若未发生错误 → 执行 `else` 块(若有)→ 执行 `finally` 块(若有)[^2][^4]。 #### 二、关键特性 1. **异常类型匹配** - 可指定具体错误类型(如 `except ValueError`),精准捕获特定异常[^2]。 - 通用捕获:`except Exception as e` 捕获所有继承自 `Exception` 的异常,`e` 存储错误信息。 2. **资源安全保障** `finally` 块确保资源(如文件、网络连接)必被释放,避免泄漏[^4]: ```python file = open("data.txt", "r") try: data = file.read() except IOError: print("文件读取失败") finally: file.close() # 无论是否出错都会关闭文件 ``` 3. **错误传递机制** 异常会**向调用栈上层同步传递**。若当前函数未处理,调用者中的 `try/except` 可捕获;若全程未处理,程序可能崩溃[^1]。 #### 三、典型应用场景 1. **用户输入验证** 循环检测输入合法性,直到用户输入正确[^2]: ```python while True: try: num = int(input("请输入数字: ")) break # 输入合法时退出循环 except ValueError: print("输入无效,请重试!") ``` 2. **外部操作风险** 文件操作、网络请求等可能因外部因素(如权限不足、文件缺失)失败的操作[^4]。 3. **防御性编程** 在关键逻辑(如数据计算)前预判可能的异常状态(如除零错误、空值引用)。 #### 四、注意事项 - **避免过度捕获**:仅处理可恢复的错误,未知异常应交由上层处理。 - **日志记录**:在 `except` 块中记录错误详情(如 `logging.error(e)`),便于调试。 - **与 `raise` 配合**:捕获异常后可重新抛出(`raise`),通知上层处理[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值