2014-10-24 35 views
15

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?

Trả lời

1

Chỉnh sửa: Câu trả lời này không được cập nhật nhanh chóng 2.0. Như nhanh bây giờ đã xử lý lỗi tôi đã không cập nhật câu trả lời dưới đây. Một số khía cạnh của xử lý lỗi sẽ được cập nhật trong tương lai với nhanh chóng 3.0. Bạn có thể làm theo câu trả lời này Error-Handling in Swift-Language

Swift được tạo thành typeSafe ngôn ngữ.Đó là lỗi tại thời gian biên dịch thay vì chờ đợi gây ra khi chạy.

Trong ví dụ đầu tiên bạn đang sử dụng Optional.

var test: String? 

Đầu tiên hiểu ý nghĩa của optional .Khi bạn xác định optional bạn đang nói nó có thể là nil or have no value Now khi bạn unwrapping test bạn đang nói tôi biết giá trị này là not nil Xin vui lòng Unwrap nó tôi chắc chắn về that.So bạn của mình có trách nhiệm để xem nơi nó nil .Nếu bạn không chắc chắn về điều đó hơn bạn nên sử dụng tùy chọn here.When ràng buộc bạn không chắc chắn về giá trị luôn luôn sử dụng nếu điều kiện trong khi unwrrapping

if let notNilTest = test { 
    //use notNilTest 
    } 
    else{ 
    //handle error 
    } 

Trong s Ví dụ econd nó nên có ý nghĩa để có xử lý ngoại lệ thời gian chạy nhưng bạn có thể dễ dàng có được điều này với if điều kiện có count.So trong ví dụ thứ hai là nhà phát triển bạn nên sử dụng nếu điều kiện để có được count của mảng.

Từ hướng dẫn nhanh chóng:

Nếu bạn cố gắng sử dụng cú pháp subscript để lấy hoặc đặt một giá trị cho một chỉ số nằm ngoài giới hạn hiện tại của một mảng, bạn sẽ kích hoạt một lỗi runtime.Tuy nhiên, bạn có thể kiểm tra xem chỉ mục có hợp lệ trước khi sử dụng nó hay không, bằng cách so sánh chỉ mục đó với thuộc tính đếm của mảng. Ngoại trừ khi số lượng là 0 (có nghĩa là mảng trống), chỉ mục hợp lệ lớn nhất trong mảng sẽ luôn được tính - 1, vì mảng được lập chỉ mục từ 0.

Họ đề cập rõ ràng về điều này và bạn nên chăm sóc những điều này để làm cho mã của bạn ít bị lỗi. Một số điều họ đã cung cấp và chúng ta nên biết cách sử dụng những thứ này.

+4

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? –

+0

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

+4

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# –

0

Cân nhắc sử dụng câu lệnh bảo vệ thay vì nhiều câu lệnh nếu được phép.

var arr = [0,1,2] 
for i = 0...3 { 
    Guard arr[i] != nil else { 
     Continue 
    } 
    println(arr[i]) //oops! 
} 

Hoặc thay vì

if let x = some value { 
    If let y = someOtherVal { 
     If let z = yetanotherVal { 
      Product = x * y* z 
     } 
    } 
} 

là gần như không gọn gàng như:

Let x = someVal 
Let y = someOtherVal 
Let z = yetAnotherVal 

Guard x != nil, 
    y != nil, 
    z != nil 
Else { 
    Return 
} 

Product = x * y * z 
Các vấn đề liên quan