Tôi hoàn toàn nhận thức được rằng Swift không có cơ chế thử/nắm bắt các ngoại lệ (OK, Swift 2.0 hiện hỗ trợ chúng). Tôi cũng hiểu rằng nhiều phương thức API trả về một NSError sẽ được lấp đầy với một đối tượng lỗi nếu có gì đó không ổn. Vì vậy, vui lòng không chỉ cho tôi câu hỏi này: Error-Handling in Swift-LanguageXử lý lỗi thời gian chạy trong Swift
Nhưng điều này vẫn không giải thích cách phản ứng với các lỗi thời gian chạy trong mã của riêng bạn, như truy cập mảng ngoài giới hạn hoặc buộc mở một giá trị tùy chọn đó là không. Ví dụ:
var test: String?
test = nil
println(test!) //oops!
hoặc
var arr = [0,1,2]
for i = 0...3 {
println(arr[i]) //oops!
}
Mỗi lập trình viên làm cho sai lầm như vậy thỉnh thoảng và cần có một cách để đăng nhập ít nhất họ để phân tích sau đó. Trong khi gỡ lỗi, Xcode có thể hiển thị cho chúng tôi, nhưng nếu điều này xảy ra với người dùng cuối hoặc người thử nghiệm beta thì sao? Trong tinh khiết C có xử lý tín hiệu và nó có thể được sử dụng trong Objective-C là tốt. Có một cái gì đó như thế này trong Swift? Một cuộc gọi lại tập trung được nhập ngay trước khi ứng dụng chết?
Cập nhật:
Hãy để tôi nói lại câu hỏi: trong một dự án lớn, nó không phải là khả thi để tự kiểm tra đối với các lỗi trên trên tất cả các vòng lặp và lực unwrapping. Khi một lỗi thời gian chạy không xảy ra cuối cùng, là có một cuộc gọi như xử lý segfault Objective C hoặc NSSetUncaughtExceptionHandler sẽ được gọi để lỗi có thể được đăng nhập/e-mail cùng với một stacktrace của vụ tai nạn?
này về cơ bản có nghĩa là "bạn xử lý các lỗi bằng cách không làm bất kỳ sai sót". Những ví dụ này là cực kỳ đơn giản, nhưng trong một dự án 50000 dòng nó sẽ không khả thi hoặc khá để kiểm tra những người trên mỗi vòng lặp duy nhất và lực lượng unwrapping. Và cuối cùng lỗi thời gian chạy S W xảy ra. Rồi sao? –
Nếu bạn không sử dụng những điều này trong thực tế, nó rất dễ bị tổn thương và không thực tế khi thử chặn khối xử lý tất cả các ngoại lệ này. Bạn sử dụng try/catch hoặc if condition. Có rất nhiều lỗi cũng xảy ra do xử lý lỗi và điểm có thể tranh cãi hợp lệ.Nhưng nó luôn luôn là tốt hơn để có biện pháp phòng ngừa – codester
Mục tiêu C có xử lý tín hiệu và NSSetUncaughtExceptionHandler. Java có Thread.setDefaultUncaughtExceptionHandler. C# có AppDomain.UnhandledException. Lưu ý cách những người đó không phải là các khối try/catch, nhưng các trình xử lý tập trung trong trường hợp mọi thứ khác không thành công. Tại sao không có một thứ như vậy trong Swift? Nó không an toàn hơn Java hay C# –