2016-03-13 18 views
6

Điều này có thể dễ dàng. Chúng ta biết rằng toán tử &+ thực hiện số học mô-đun trên các số nguyên (bao quanh), trong khi toán tử + gây ra lỗi.Làm cách nào để bẫy lỗi tràn số học trong Swift?

$ swift 
    1> var x: Int8 = 100 
x: Int8 = 100 
    2> x &+ x 
$R0: Int8 = -56 
    3> x + x 
Execution interrupted. Enter Swift code to recover and continue. 

Lỗi này là gì? Tôi không thể bắt nó và tôi không thể biến nó vào một tùy chọn:

4> do {try x + x} catch {print("got it")} 
Execution interrupted. Enter Swift code to recover and continue. 
    5> try? x + x 
Execution interrupted. Enter Swift code to recover and continue. 

Tôi khá chắc chắn loại hình báo lỗi là cùng một loại lỗi từ this StackOverflow question (một chia-by-zero) nhưng tôi không biết loại lỗi này có thể bị mắc kẹt hay không. Điều gì đơn giản tôi đang thiếu? Nó có thể bị mắc kẹt hay không? Nếu vậy, làm thế nào?

Trả lời

8

Phân biệt giữa ngoại lệ và lỗi thời gian chạy. Một ngoại lệ được ném và có thể bị bắt. Một lỗi thời gian chạy dừng chương trình của bạn chết trong các bài hát của nó. Thêm và nhận được một tràn là một lỗi thời gian chạy, đồng bằng và đơn giản. Không có gì để bắt.

Điểm của nhà điều hành như &+ là điểm không có lỗi và không cho bạn biết có sự cố. Đó là toàn bộ điểm.

Nếu bạn nghĩ rằng bạn có thể tràn, và bạn muốn biết liệu bạn đã làm, sử dụng phương pháp tĩnh như addWithOverflow. Nó trả về một tuple bao gồm kết quả và một Bool cho biết liệu có tràn hay không.

var x: Int8 = 100 
let result = x &+ x // -56 

x = 100 
let result2 = Int8.addWithOverflow(x,x) // (-56, true) 
+0

Cảm ơn, tôi biết nó không phải là lỗi được ném (ngoại trừ như bạn nói, mặc dù Apple dường như tránh thuật ngữ đó), vì nó không thể bị bắt; Tôi đã tự hỏi nếu có một số cách để "bẫy nó" anyway. Nó có thể là lỗi thời gian chạy trong Swift là untrappable; đó sẽ là một câu trả lời tốt. Tôi không thể tìm thấy bất kỳ thông tin nào nói rõ ràng rằng đó là trường hợp. Bạn đã có một tài liệu tham khảo? Tôi đoán tôi có thể đã nêu câu hỏi tốt hơn. Tôi muốn biết chắc chắn những _can't_ được xử lý. –

+0

Trường hợp ngoại lệ không xác định là lỗi thời gian chạy. Nhưng không phải mọi lỗi thời gian chạy là một ngoại lệ có thể tra cứu được. Khi các tài liệu cho bạn biết rằng một cái gì đó "là một lỗi thời gian chạy", họ đang nói với bạn rằng bạn không bao giờ có thể lấy đi với làm điều này; nó sẽ dừng chương trình của bạn chết. Ví dụ, ngoài phạm vi là một lỗi thời gian chạy. – matt

+1

BTW Tôi hiểu câu hỏi của bạn (trong nhận xét của bạn), nhưng tất cả tôi có thể cho bạn biết đó là một quyết định thiết kế. Tôi đã có một số cuộc thảo luận về lý do tại sao họ đã không làm cho những thứ như ngoài phạm vi một ngoại lệ dễ bắt được, và câu trả lời là trên mức lương của tôi; có vẻ như điều này sẽ quá đắt. Bạn cần nói chuyện với một nhà khoa học máy tính để tìm hiểu thêm về điều đó. :) – matt

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