2009-09-14 37 views
28

Tôi có một ứng dụng giao diện điều khiển được viết bằng C# /. NET mà tôi muốn chạy từ một tập lệnh (nant). Nếu một ngoại lệ xảy ra trong ứng dụng giao diện điều khiển, tôi muốn nant tiếp tục, nhưng trong Windows Vista có một cửa sổ bật lên tìm kiếm các giải pháp và yêu cầu gỡ lỗi, v.v.Tránh "chương trình ngừng hoạt động" trong C# /. NET

Tôi muốn tránh cửa sổ bật lên với chương trình "khi một ngoại lệ xảy ra trong ứng dụng giao diện điều khiển. Làm thế nào tôi có thể kiểm soát điều này từ C# /. NET?

(Một câu hỏi tương tự như địa chỉ the issue for the C language, nhưng tôi muốn một giải pháp cho C#/NET..)

(Để làm rõ: Tôi muốn các ngoại lệ được thông qua để Nant, nhưng mà không popup.)

Trả lời

40

Cửa sổ bật lên trình gỡ lỗi JIT xảy ra khi có ngoại lệ không được xử lý. Đó là, một đường hầm ngoại lệ tất cả các con đường lên stack đến gốc của bất kỳ thread trong thời gian chạy.

Để tránh điều này, bạn có thể xử lý sự kiện AppDomain.CurrentDomain.UnhandledException và chỉ cần gọi Environment.Exit(1) để thoát một cách duyên dáng.

Điều này sẽ xử lý tất cả ngoại lệ trên tất cả các chuỗi trong AppDomain của bạn. Trừ khi bạn đang làm bất cứ điều gì đặc biệt, ứng dụng của bạn có thể chỉ có một AppDomain, vì vậy đặt này trong phương pháp public static void Main của bạn nên đủ:

AppDomain.CurrentDomain.UnhandledException += (sender, args) => 
{ 
    Console.Error.WriteLine("Unhandled exception: " + args.ExceptionObject); 
    Environment.Exit(1); 
}; 

Bạn nên có lẽ sử dụng logger Nant để viết ra các lỗi trong trường hợp này quá (không thể nhớ lại API này cho mặc dù vậy.)

Bạn cũng có thể disable JIT debugging trên máy. Tôi sẽ chỉ khuyên bạn nên điều này trong một số trường hợp như cho một máy chủ xây dựng chuyên dụng.

+1

Bạn nên hỏi nếu bạn đang ở chế độ phát hành trước, sau khi điều này sẽ giết gỡ lỗi – Andreas

+0

Tại sao 'args.ExceptionObject' không phải là một' Ngoại lệ '? Có an toàn không? – Winter

+0

@Winter câu hỏi hay. Tôi muốn sử dụng 'as' cast và tự kiểm tra' null'. –

1

Chỉ cần nắm bắt ngoại lệ và ghi/bỏ qua nó.

+0

Có, tránh cửa sổ bật lên nhưng cũng tránh được lợi thế có các chương trình khác gọi chương trình này biết rằng một số ngoại lệ đã xảy ra. Xem câu trả lời được chấp nhận. –

+0

Bạn có thể gọi Environment.Exit trong khối catch. – maciejkow

0

Thông thường điều này chỉ xảy ra khi ứng dụng của bạn không xử lý ngoại lệ. Nếu bạn bọc toàn bộ ứng dụng bảng điều khiển của mình trong một bẻ khóa thử/bắt và chỉ trả lại mã không thành công, thì bạn sẽ tránh điều này.

1

Cửa sổ bật lên xuất hiện do một ngoại lệ chưa được xử lý. Để tránh điều đó, hãy đảm bảo phương thức chính của bạn nắm bắt tất cả ngoại lệ và biến chúng thành một số thông tin hữu ích khác mà bạn có thể nhận. Chỉ cần bỏ qua ngoại lệ là không nên.

Btw hãy nhớ rằng các ngoại lệ là theo chủ đề, vì vậy nếu ứng dụng của bạn sinh ra các chủ đề hoặc sử dụng các chủ đề của chuỗi chủ đề, bạn cũng cần một trình xử lý cho các chủ đề này.

1

Trong Windows Vista, bạn có thể tắt hộp thoại này cho các chương trình của bạn.

Tắt "Báo cáo sự cố và tính năng Giải pháp". Bạn tìm thấy nó trong Bảng điều khiển -> Báo cáo sự cố và Giải pháp -> Thay đổi cài đặt -> Cài đặt nâng cao -> Tắt chương trình của tôi, báo cáo sự cố

+0

Có, điều đó có thể xảy ra nếu tôi cài đặt trên máy của riêng mình, nhưng tôi muốn nó được đưa vào chương trình sao cho nó hoạt động nhất quán trên các máy khác. (Xem câu trả lời được chấp nhận.) –

+1

Tôi có thể làm điều này trên windows 10 không? – zsf222

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