2016-03-03 13 views
9

Nhanh chóng, có thể sử dụng ngắn hơn guard let try? có ngoại lệ xảy ra nếu nhập khối khác không?Có thể truy xuất ngoại lệ trong câu lệnh bảo vệ bằng "try?" Không?

guard let smth = try? myThrowingFunc() else { 
    print(error) //can I access the exception here somehow? 
    return 
} 

vs

let smth: AnyObject? 
do { 
    smth = try myThrowingFunc() 
} catch let error { 
    print(error) 
    return 
} 
+1

Tôi khá chắc chắn rằng thử? là như thế nào? và sẽ chỉ chuyển smh thành enum tùy chọn, nơi bạn còn lại để unwrap/xác nhận nó theo yêu cầu. có nghĩa là, tôi nghĩ rằng nó lấy ra khỏi mô hình do/catch –

+0

Có, và 'guard let smth = ...' cố gắng unwrap - nếu nó thất bại, sau đó nó sẽ thực thi khối khác. Vì vậy, cấu trúc này có thể là tuyệt vời, nếu nó sẽ có thể bằng cách nào đó truy cập ngoại lệ ... – smat88dd

+0

Nhưng cảm ơn, tôi có thể hiểu cách nó hoạt động và trả lời câu hỏi của tôi bản thân mình! – smat88dd

Trả lời

5

Tôi đã tìm thấy trang số 42 trong "Ngôn ngữ lập trình Swift (Swift 2.2 Prerelease)", nơi nó khẳng định một cách rõ ràng như sau:

Một cách khác để xử lý lỗi là sử dụng try? để chuyển đổi kết quả thành tùy chọn. Nếu chức năng ném lỗi, lỗi cụ thể sẽ bị loại bỏ và kết quả là nil. Nếu không, kết quả là một tùy chọn chứa giá trị mà hàm trả về.

Vì vậy, đây sẽ là một yêu cầu tính năng cho quả táo sau đó. Như một vấn đề của thực tế có một số thảo luận đã về chủ đề này ở đây:

http://thread.gmane.org/gmane.comp.lang.swift.evolution/8266

+0

Tôi sử dụng mẫu này, nếu để cho một số = hãy thử someOptional {} thường là nơi tôi không cần phải lo lắng về việc đánh bắt nội dung. –

+0

Vâng, điều trái ngược với điều bảo vệ. Bảo vệ rất hữu ích cho việc thoát khỏi một hàm. Tôi đã đăng ký danh sách gửi thư tiến hóa nhanh chóng và dường như có sự quan tâm đến tính năng đó, bởi vì đã có người khác có cùng ý tưởng: http://thread.gmane.org/gmane.comp.lang.swift.evolution/ 8266 – smat88dd

Các vấn đề liên quan