Jerry nói: ... kết quả không còn là C ++ nữa , trong khi ẩn dụ của tôi là nó rõ ràng là C ++, chỉ là một phương ngữ hơi khác vì các chương trình sử dụng các hình thức, quy ước và phong cách viết khác.
Đây là những lý do chính của tôi để vô hiệu hóa chúng:
Tương thích nhị phân
Ngôn ngữ giao thoa và ranh giới dịch thuật không được xác định rõ ràng hoặc không xác định. Nếu bạn muốn đảm bảo chương trình của bạn hoạt động trong miền của hành vi được xác định, bạn sẽ cần cách ly các ngoại lệ tại các điểm thoát mô-đun.
Kích thước thực thi
Dưới đây là các kích thước nhị phân của một chương trình miễn phí ngoại lệ tôi đã viết, được xây dựng mà không có ngoại lệ được bật:
Không có ngoại lệ:
- thực thi + phụ thuộc: 330
- cuối cùng bị tước bỏ thực thi (phát hành bản dựng): 37
Ngoại trừ:
- thực thi + phụ thuộc: 380
- thực thi tước cuối cùng (phát hành bản dựng): 44
Nhắc nhở: Đó là một tập hợp các thư viện và chương trình có chứa số lần ném / bắt không. Cờ trình biên dịch không cho phép các ngoại lệ trong thư viện chuẩn C ++. Do đó, chi phí trong thế giới thực là hơn 19% được thấy trong ví dụ này.
Trình biên dịch: apple gcc4.2 + llvm. Kích thước tính bằng MB.
Tốc độ
Mặc dù thuật ngữ "ngoại lệ chi phí bằng không", họ vẫn thêm một số chi phí ngay cả khi không có gì ném. Trong trường hợp trên, đây là một chương trình quan trọng về hiệu suất (Xử lý tín hiệu, Tạo, Trình bày, Chuyển đổi, với các bộ / tín hiệu dữ liệu lớn, v.v.). Ngoại lệ không phải là một tính năng cần thiết trong thiết kế này, trong khi hiệu suất là rất quan trọng.
Chương trình chính xác
Có vẻ như là một lý do kỳ lạ ... Nếu ném không phải là một lựa chọn, bạn phải viết các chương trình được kiểm tra tương đối nghiêm ngặt, chính xác, để đảm bảo chương trình của bạn thực thi chính xác và khách hàng sử dụng giao diện chính xác (nếu bạn đưa ra một lập luận xấu hoặc làm không kiểm tra mã lỗi, thì bạn xứng đáng với UB). Kết quả? Chất lượng thực hiện cải thiện đáng kể và các vấn đề được khắc phục nhanh chóng.
Sự đơn giản
Việc triển khai xử lý ngoại lệ thường không được cập nhật. Chúng cũng thêm rất nhiều phức tạp vì một triển khai có thể có nhiều chuỗi thoát. Việc đọc và duy trì các chương trình rất phức tạp sẽ đơn giản hơn khi chúng sử dụng một tập hợp nhỏ các chiến lược thoát được xác định rõ, đánh máy, tạo ra và được xử lý bởi khách hàng. Trong các trường hợp khác, việc triển khai có thể theo thời gian thực hiện nhiều cú ném hơn hoặc sự phụ thuộc của chúng có thể giới thiệu chúng. Khách hàng không thể dễ dàng hoặc thích hợp bảo vệ chống lại tất cả những lối thoát này. Tôi viết và cập nhật rất nhiều thư viện, có sự phát triển và cải tiến thường xuyên. Cố gắng giữ cho tất cả đồng bộ với các chuỗi thoát ngoại lệ (trong một cơ sở mã lớn) sẽ không sử dụng tốt thời gian và có thể sẽ gây ra nhiều tiếng ồn và tiếng ồn. Do tính chính xác của chương trình tăng lên và nhiều bài kiểm tra hơn,
Lịch sử / Mã hiện tại
Trong một số trường hợp, chúng không bao giờ được giới thiệu vì lý do lịch sử. Một cơ sở mã hiện tại đã không sử dụng chúng, việc thay đổi các chương trình có thể mất nhiều năm và khiến nó thực sự xấu xí để duy trì vì sự chồng chéo trong các quy ước và triển khai.
Nhược điểm
Tất nhiên, có những nhược điểm, lớn nhất là: Tính không tương thích (bao gồm nhị phân) với các thư viện khác và thực tế là bạn sẽ phải triển khai một số lượng lớn các chương trình để phù hợp với mô hình này.