2009-07-21 29 views

Trả lời

7

Ý 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; 
+0

cảm ơn vì đã đánh cắp lỗi đánh máy – weilin8

+0

@rein: không chỉ chuỗi chết; nó mất toàn bộ quá trình. –

+0

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

4

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;

+0

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ự. –

+0

Có - tôi đã đề cập đến điều đó. –

7

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ì.

+0

Đồ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

+0

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

1

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.

0

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ó.

0

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.

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