Swift không có cơ chế để bắt tất cả ngoại lệ thời gian chạy tùy ý. Lý do được giải thích trong
trên nhanh chóng người dùng danh sách gửi thư. Giải nén:
Swift làm một sự lựa chọn có ý thức không bao gồm trường hợp ngoại lệ ném qua khung stack tùy ý không phải vì nó là về mặt kỹ thuật không thể, nhưng vì thiết kế của nó được đánh giá chi phí là quá cao.
Vấn đề là: nếu một đoạn mã sắp thoát sớm vì lỗi, nó phải được viết để xử lý lối thoát sớm đó. Nếu không nó sẽ hoạt động sai, không đóng được bộ nhớ, không đóng tập tin xử lý/ổ cắm/kết nối cơ sở dữ liệu/bất cứ điều gì, không giải phóng khóa, v.v. Trong một ngôn ngữ như Java, viết mã thực sự ngoại lệ an toàn yêu cầu số lượng vô lý thử/cuối cùng là khối. Đó là lý do tại sao không ai làm điều đó. Họ đưa ra các phán đoán về ngoại lệ nào mà họ đang xem là và tài nguyên nào nguy hiểm bị rò rỉ và chỉ bảo vệ mã của họ dựa trên các điều kiện dự đoán cụ thể đó. Sau đó, điều gì đó không lường trước được xảy ra và chương trình của họ bị gián đoạn.
này thậm chí còn tồi tệ hơn trong một ngôn ngữ tài liệu tham khảo-tính như Swift vì cân bằng đúng số lượng tài liệu tham khảo trong sự hiện diện của ngoại lệ cơ bản đòi hỏi mỗi chức năng để bao gồm tiềm ẩn khối finally để cân bằng tất cả các giữ lại đếm. Điều này có nghĩa là trình biên dịch phải tạo nhiều mã bổ sung trên cơ hội tắt mà một số cuộc gọi hoặc một trường hợp ngoại lệ khác. Phần lớn mã này không bao giờ, từng được sử dụng, nhưng nó phải ở đó, làm đầy quá trình này.
Vì những vấn đề này, Swift đã chọn không hỗ trợ các ngoại lệ truyền thống ; thay vào đó, nó chỉ cho phép bạn ném lỗi trong các khu vực mã đặc biệt được đánh dấu đặc biệt là . Nhưng như một hệ quả, điều đó có nghĩa rằng, nếu có điều gì đó thực sự sai trong mã mà không thể ném, tất cả nó có thể thực sự làm để ngăn ngừa thảm họa là sự cố. Và hiện tại, chỉ điều bạn có thể gặp phải là toàn bộ quá trình.
NSSetUncaughtExceptionHandler có sẵn là Swift: http://stackoverflow.com/questions/25441302/how-should-i-use-nssetuncaughtexceptionhandler-in-swift. Tuy nhiên, nó chỉ bắt ngoại lệ Objective-C, chứ không phải lỗi thời gian chạy Swift hoặc lỗi 'throw'n. –
Cảm ơn @MartinR vì đã trả lời nhanh chóng của bạn. Tôi biết về NSSetUncaughtExceptionHandler rằng nó xử lý các trường hợp ngoại lệ của Objective-C. Tuy nhiên tôi đang tìm kiếm cùng một điều tương tự cho Swift. –
Swift không có cơ chế để bắt tất cả các loại lỗi thời gian chạy. Tôi chỉ có thể đoán được lý do. Ví dụ, nó sẽ không hoạt động tốt với tính toán tham chiếu tự động. Bạn có thể nhận được phản hồi tốt hơn từ các nhà phát triển Swift trên một trong các danh sách gửi thư tại swift.org. –