2016-02-09 17 views
6

Khi ứng dụng bàn điều khiển C# .Net kết thúc do ngoại lệ chưa được xử lý, có quy tắc nào xác định mã thoát nào được trả về hay 255 luôn sử dụng?Mã thoát khi không thực hiện ngoại lệ chấm dứt thực thi?

Tôi chưa thể tìm thấy tài liệu về điều này. Một ứng dụng giao diện điều khiển đơn giản thực hiện throw new Exception() chết với mã thoát 255. Tôi muốn biết liệu có an toàn để giả định rằng tất cả các ngoại lệ chưa được giải quyết sẽ trả về mã lỗi tương tự này hay không hoặc nếu có các biến thể/trường hợp góc mà tôi cần biết.

C:\Temp\> ThrowsExceptionConsoleApp.exe 
C:\Temp\> echo %errorlevel% 
255 
+3

Không tìm thấy gì trong [ECMA-335] (http://www.ecma-international.org/publications/standards/Ecma-335.htm), vì vậy tôi đoán mã thoát của thời gian chạy không được chuẩn hóa cho trường hợp ngoại lệ chưa được xử lý. – Gene

+1

Hmm, đối với tôi trên Windows 10.0.14393, 'ECHO% ERRORLEVEL%' kết quả đầu ra '-532462766'. – binki

Trả lời

5

Không, không phải lúc nào. 255 là một số Unix, thường được tạo ra bằng cách thoát với -1, không rõ làm thế nào bạn có thể thấy điều đó. Trên Windows, một tiến trình .NET thường thoát với giá trị mã ngoại lệ SEH, một quá trình có quá trình sụp đổ và chấm dứt. Thông thường -532462766 (aka 0xE0434352) cho một ngoại lệ được quản lý. 3 cặp hex cuối cùng đánh vần "CCR", một từ viết tắt có ý nghĩa bị mất trong sương mù của thời gian, được khai báo là EXCEPTION_COMPLUS trong corexcep.h. Câu hỏi mẫu is here.

Một chương trình được xử lý tốt sẽ đăng ký AppDomain.CurrentDomain.UnhandledException và cung cấp mã thoát tốt hơn khi nó gọi Environment.Exit(), giống như được tạo bởi Marshal.GetHRForException(). Bạn sẽ nhận được mã thoát khớp với loại ngoại lệ được quản lý, các giá trị cho các loại ngoại lệ chuẩn được ghi lại trong tệp CorError.h SDK.


echo %errorlevel% 

Nó không thấy rằng trong câu hỏi trước. % errorlevel% chỉ có thể có giá trị từ 0 đến 255, một hạn chế quay trở lại ngày MS-Dos. Vì mã ngoại lệ SEH sẽ luôn luôn lớn hơn, bạn thường luôn thấy 255. Chỉ cách sane để sử dụng% errorlevel% là giả sử chương trình thất bại khi nó không phải là 0. Trừ khi bạn có tài liệu cụ thể từ tác giả chương trình.

+2

Dường như hạn chế được nâng lên đôi khi bởi vì trong Windows 10.0.14393 tôi nhận được '-532462766' cho' ECHO% ERRORLEVEL% '. – binki

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