Ý kiến của bạn trong việc xử lý các ngoại lệ trong quá trình thực thi của luồng là gì? Cụ thể hơn, nếu ngoại lệ được ném bên trong khối catch của một mệnh đề try-catch thì sao? Và điều gì xảy ra với luồng nếu ngoại lệ bị hủy?Thực hành tốt nhất để xử lý ngoại lệ, được ném trong khối catch, trong một chuỗi. (.NET)
Trả lời
Ý kiến của bạn trong việc xử lý ngoại lệ trong quá trình thực hiện của một chuỗi là gì?
Bạn nên xử lý ngoại lệ bất cứ khi nào có thể và bất cứ khi nào bạn mong đợi ngoại lệ. Làm rõ: Tôi hoàn toàn đồng ý với John rằng bạn không nên xử lý ngoại lệ ở mọi nơi - chỉ nơi bạn có thể làm điều gì đó về họ. Tuy nhiên, bạn không bao giờ nên để một ngoại lệ đi unhandled trong một chủ đề vì điều này sẽ gây ra vấn đề nghiêm trọng. Có một trình xử lý ngoại lệ gốc và để cho chuỗi của bạn chết một cách duyên dáng (sau khi đăng nhập vấn đề, v.v.)
Cụ thể hơn, nếu luồng được ném bên trong khối catch của mệnh đề try-catch thì sao?
Ý của bạn là: Điều gì xảy ra nếu ngoại lệ được ném trong khối catch? Vâng, sau đó nó đi unhandled bởi khối try-catch hiện tại. Tốt nhất là không đặt quá nhiều chế biến trong một khối catch để tránh tình trạng này càng nhiều càng tốt.
Và điều gì sẽ xảy ra với chuỗi nếu chuỗi không được xử lý?
Ý của bạn là: Điều gì sẽ xảy ra với chuỗi nếu ngoại lệ bị hủy? Nó chết.
Và như Ben nói:
Một ngoại lệ còn tự do trong một thread gây nên một UnhandledException trong AppDomain các chủ đề của. Bạn có thể xem cho những bằng cách thêm một xử lý sự kiện:
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Một ngoại lệ còn tự do trong một thread gây nên một UnhandledException trong AppDomain của chủ đề. Bạn có thể xem cho các bằng cách thêm một xử lý sự kiện:
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Lưu ý rằng mặc dù bạn pháo "xử lý" ngoại lệ theo nghĩa truyền thống. Sau khi xử lý sự kiện này đã được thực thi, AppDomain có thể sẽ chết. Việc sử dụng sự kiện này chủ yếu là để có thể ghi lại thông tin về ngoại lệ hoặc các hành động tương tự. –
Có - tôi đã đề cập đến điều đó. –
tôi phải đồng ý với em, hoặc ít nhất là với những gì nó có vẻ như ông muốn nói.
Chỉ xử lý ngoại lệ nếu bạn thực sự có thể xử lý chúng. Chỉ khi bạn có thể làm điều gì đó về những gì đã xảy ra hoặc thêm thông tin. Đừng xử lý chúng chỉ vì bạn có thể.
try {
// ..
} catch (Exception ex) {
Console.WriteLine(ex.Message);
}
Ở trên là rất xấu. Trước tiên, bạn không hiển thị toàn bộ ngoại lệ, mà chỉ hiển thị Thông báo. Thứ hai, bạn để mọi thứ tiếp tục và bạn không biết trạng thái của quy trình là gì.
Đồng ý. Tôi không muốn ngụ ý rằng sẽ có các khối try-catch xung quanh mỗi bit mã. Cảm ơn vì đã bắt được điều đó. – rein
Tôi hoàn toàn đồng ý. Những giai điệu của câu trả lời của rein (mặc dù ông làm rõ ông không có nghĩa là ngụ ý điều này) có thể được cho người mới bắt đầu viết các khối try-catch là một điều tốt. Tôi sẽ nói, cố gắng viết mã ngoại lệ an toàn, với ít khối try-catch nhất có thể; và chỉ sau đó bắt đầu quan tâm đến các ngoại lệ mà bạn thực sự có thể xử lý trong các trường hợp rất cụ thể. Chỉ ở cấp cao nhất của ứng dụng của bạn (và có thể là ranh giới chính của các lớp ứng dụng của bạn), hãy quan tâm đến việc bắt tất cả các ngoại lệ (để báo cáo và cho phép ứng dụng của bạn chết) – jeroenh
Trường hợp ngoại lệ trong chuỗi khiến quá trình của bạn bị chết và chết với thông báo vô ích trong nhật ký sự kiện của bạn.
Có trình xử lý ngoại lệ cấp cao nhất trong mỗi chuỗi đăng nhập (và có thể ném lại) là một thực hành tốt, vì cài đặt trình xử lý ngoại lệ cho appdomain như các câu trả lời khác đề cập đến.
Nếu bạn cho rằng mình có thể xử lý ngoại lệ, bạn nên bắt nó. Tất cả các trường hợp ngoại lệ khác mà không thể được xử lý nên bong bóng lên đến bề mặt của ngăn xếp, nơi nếu dọc theo cách không xử lý thích hợp được tìm thấy, sẽ cho phép các chủ đề chết.
Bạn không nên viết bất kỳ mã nào trong khối catch có thể ném một ngoại lệ khác, nhưng nếu bạn cần bạn có thể lồng thêm khối thử khác xung quanh nó.
Cơ chế ngoại lệ .net về cơ bản không cung cấp bất kỳ cách nào tốt để xử lý ngoại lệ xảy ra trong quá trình thực thi khối catch hoặc trong quá trình thực thi khối "cuối cùng" trong khi ngoại lệ khác đang chờ xử lý. Xử lý thích hợp sẽ yêu cầu rằng .net hỗ trợ một loại ngoại lệ tổng hợp có thể bị chặn bởi các khối "bắt" đối với bất kỳ thành phần nào của nó, nhưng sẽ tự động được gọi lại cho đến khi tất cả các bộ phận cấu thành đã được xử lý. Thật không may, .net không cung cấp bất kỳ loại ngoại lệ hỗn hợp nào như vậy; trong khi người ta có thể xác định và sử dụng các loại tùy chỉnh theo cách như vậy để có được ngữ nghĩa như vậy, mã để sử dụng chúng sẽ khá xấu, và chúng sẽ không tích hợp tốt với các ngoại lệ mà mã khác có thể ném.
Do đó, người ta phải đối mặt với một sự lựa chọn: ngăn chặn ngoại lệ mới và để cho người cũ tuyên truyền, để người mới tuyên truyền và mất người cũ hoặc tạo một đối tượng ngoại lệ tổng hợp mà chỉ có thể được xử lý bằng mã biết để tìm nó. Không ai trong số đó là những lựa chọn đặc biệt dễ chịu. Cái nào là tốt nhất sẽ phụ thuộc vào sự hiểu biết về các điều kiện mà các loại ngoại lệ khác nhau đại diện, và mã gọi nào sẽ trông đợi với chúng.
- 1. ném ngoại lệ mới vs Catch khối
- 2. ngoại lệ bắt thực hành tốt nhất (. C#/net)
- 3. Thực hành tốt nhất trong việc xử lý ngoại lệ java
- 4. Thực hành tốt cho các ngoại lệ Java xử lý
- 5. Ném ngoại lệ trong bộ xử lý ngoại lệ
- 6. try-catch thực hành xử lý ngoại lệ dành cho iPhone/Objective-C
- 7. Nhiều loại xử lý ngoại lệ khác nhau trong một khối catch?
- 8. Thực hành tốt nhất trong đánh bắt và ném nullpointerexception?
- 9. Xử lý ngoại lệ chưa xử lý trong .NET 1.1
- 10. Cách tốt nhất để ném ngoại lệ trong mã JNI?
- 11. Xử lý ngoại lệ: Cuối cùng được thực hiện sau khi ném?
- 12. Ném nhiều ngoại lệ trong .Net/C#
- 13. Xử lý ngoại lệ tốt hơn trong JPA
- 14. Làm thế nào tôi có thể Rethrow một ngoại lệ từ khối catch trong Powershell?
- 15. Cách tốt nhất để xử lý ngoại lệ từ Net :: HTTP là gì?
- 16. Có phải "ném ngoại lệ" thực hành không tốt?
- 17. cách xử lý ngoại lệ chưa được xử lý trong thư viện trong node.js
- 18. Cách tốt nhất để tái sử dụng logic xử lý ngoại lệ trong C# là gì?
- 19. Tài nguyên có được xử lý ngay cả khi một ngoại lệ được ném vào một khối sử dụng không?
- 20. Xử lý ngoại lệ thanh lịch hơn so với nhiều khối catch?
- 21. xử lý ngoại lệ trong C#
- 22. BackgroundWorker xử lý ngoại lệ
- 23. Trong Java, đang sử dụng ném ngoại lệ thay vì ném nhiều ngoại lệ cụ thể thực hành tốt?
- 24. ngoại lệ xử lý trong Boost.Asio
- 25. Delphi Xử lý ngoại lệ vấn đề với nhiều khối xử lý ngoại lệ
- 26. Xử lý ngoại lệ Netty - Trình xử lý ném ngoại lệ, sau đó là gì?
- 27. Tăng ngoại lệ chưa được xử lý trong chuỗi trong chuỗi chính?
- 28. Thực hành không tốt là viết một phương thức không làm gì ngoại trừ việc ném một ngoại lệ?
- 29. Nếu bắt ngoại lệ con trỏ null không phải là một thực hành tốt, là bắt ngoại lệ tốt nhất?
- 30. xử lý ngoại lệ trong Tpl
cảm ơn vì đã đánh cắp lỗi đánh máy – weilin8
@rein: không chỉ chuỗi chết; nó mất toàn bộ quá trình. –
Tôi khuyên bạn nên bằng cách nào đó kết hợp thông tin trong câu trả lời của Ben vào câu lệnh cuối cùng của bạn. Chủ đề sẽ chết nếu có một ngoại lệ không được giải quyết, nhưng nó không dừng ở đó. Ngoại lệ sẽ truyền bá chuỗi tới AppDomain và giết ứng dụng của bạn nếu bạn không có trình xử lý khác cho nó. – jasonh