2010-05-25 34 views
6

Chúng là các loại ngôn ngữ rất khác nhau và cách chúng xử lý các ngoại lệ có thể khá khác nhau .. Cách xử lý ngoại lệ được triển khai và sự khác biệt về triển khai trong các ngôn ngữ này là gì?Sự khác biệt giữa xử lý ngoại lệ C++, Java và JavaScript là gì?

Tôi cũng đặt câu hỏi này vì tôi nhận thấy rằng xử lý ngoại lệ C++ có vẻ rất chậm so với phiên bản JavaScript.

+1

C++ - vào nền tảng và trình biên dịch? – kennytm

+0

Tôi nhận ra chỉ sau khi trả lời, bạn có ý nghĩa bằng cách thực hiện các chi tiết mức thấp như cách Java xây dựng stacktraces và theo dõi đường dẫn của sự thất bại hay cái gì đó cao cấp hơn mà câu trả lời của tôi là nhằm trả lời? – Esko

+1

Làm cách nào để xử lý ngoại lệ C++ có thể chậm hơn JavaScript? Với trình duyệt nào, trên nền tảng nào, chạy mã nào, so với trình biên dịch nào, trên nền tảng nào, biên dịch mã nào? – Puppy

Trả lời

1

Tôi biết chỉ những điều cơ bản của C xử lý ngoại lệ ++ nhưng như xa như tôi có thể nhìn thấy, Java có excplicit Object thứ bậc dựa trên cho trường hợp ngoại lệ (Throwable, Exception, RuntimeException, Error) trong khi trong C++ bạn có thể làm

try 
{ 
    throw 1337; 
} 
catch (int i) 
{ 
    // i == 1337 
} 

Điều này tất nhiên phản ánh thiết kế cấu trúc lớp học của bạn và các chính sách xử lý ngoại lệ chung, v.v.

Sự khác biệt được giới thiệu bởi sự khác biệt này dường như chỉ có C++ trong thế giới Java, có nghĩa là bạn có thể ném bất cứ thứ gì vào bất kỳ lúc nào mà không cần viết mã để xử lý ngoại lệ giả ném (Tôi không sẵn sàng gọi int hoặc bất kỳ kiểu nguyên thủy nào khác ngoại lệ, chúng chỉ có thể là ngoại lệ giá trị).

Cuối cùng, do tính chất của chúng khi so sánh với ngoại lệ của Java, ngoại lệ C++ không theo mặc định chứa bất kỳ thứ gì có thể so sánh với chồng xếp của Java.

+0

Bạn nên sử dụng C++ để sử dụng các lớp bắt nguồn từ std :: exception – Nikko

+0

trong JavaScript, bạn có thể ném bất kỳ thứ gì (ngoài các đối tượng Lỗi được xác định trước). nó chỉ là một câu hỏi, hữu ích như thế nào. – Dormilich

1

Nếu bạn hỏi về cách nó tạo ra các ngoại lệ này, thì đó là một vấn đề khá phức tạp.

Một cách tiếp cận (mà tôi nghĩ rằng C++ và Java sử dụng, tôi không biết về Javascript), là để duy trì một chồng xử lý lỗi. Khi một ngoại lệ được ném ra, mục nhập đầu tiên được bật ra khỏi ngăn xếp và xử lý ngoại lệ một cách thích hợp hoặc xuất hiện một mục nhập khác từ ngăn xếp nếu nó không thể xử lý nó (chẳng hạn như nó nhận được một NullPointerException khi trình xử lý hàng đầu là một OutOfBoundException).

+0

Chiến lược này (ngăn xếp trình xử lý) không được sử dụng bởi bất kỳ triển khai Java nào mà tôi đã nghe nói đến. –

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