2011-11-01 16 views
5

Một số chức năng của Windows chẳng hạn như CreateFile có thể trả lại nhiều mã lỗi khi GetLastError được gọi và không kiểm tra mọi mã lỗi có thể xảy ra - thường không có đủ tài liệu và mã lỗi mới được thêm vào thường xuyên.Tôi nên xử lý các lỗi nào? Cái nào là "tử vong"?

Một số trong số chúng (chẳng hạn như vi phạm truy cập hoặc thông số không hợp lệ) là do lỗi lập trình viên và không cho phép tiếp tục thực hiện chương trình. Tuy nhiên, những người khác là do các yếu tố khác, chẳng hạn như quyền tập tin xấu, chia sẻ vi phạm, tên tập tin xấu, vv, mà các nhà phát triển có ít hoặc không có kiểm soát.

Tôi muốn xử lý tất cả các lỗi "không quan trọng" (chẳng hạn như tên tệp không hợp lệ), đồng thời cho phép "các lỗi nghiêm trọng" (chẳng hạn như vi phạm truy cập) làm hỏng chương trình của tôi.

Lý tưởng nhất, tôi sẽ nói:

// ... an error occurred. Is it a programmer error? 

if (IsErrorCritical(GetLastError())) 
{ 
    // Yes; raise an exception, crashing the program. 
    RaiseException(GetLastError(), 0, 0, NULL); 
} 

Làm thế nào để quyết định mã lỗi được an toàn để ngăn chặn (ví dụ, khi liệt kê các tập tin trên một đĩa), khi tôi có thể không có khả năng dự đoán mỗi kết quả ?

+2

Tôi cho rằng một chương trình sẽ không bao giờ gặp sự cố ngoại trừ trong trường hợp thật sự ngoại lệ (vi phạm truy cập, v.v.). Việc không tạo tệp phải là lỗi dự kiến ​​và được xử lý một cách duyên dáng. Bên cạnh đó, ngay sau khi một số mã lỗi mới được thêm vào, hàm IsErrorCritical() của bạn sẽ trở nên lỗi thời. – Luke

+0

Phải, nhưng làm thế nào để tôi biết nếu một cái gì đó "thực sự đặc biệt"? Đó là câu hỏi .. – Mehrdad

+0

Khi tôi nói đặc biệt, tôi có nghĩa là chính xác điều đó. Vi phạm truy cập và hết bộ nhớ là hai lỗi lớn; có thể có những người khác, nhưng bạn có được ý tưởng. Nếu CreateFile() không làm cho chương trình của bạn bị lỗi thì bạn đang làm sai IMHO. – Luke

Trả lời

3

Tôi nghĩ điều đó thực sự phụ thuộc vào ngữ cảnh, không thể quyết định chung điều này thay vì nó cần được quyết định theo từng trường hợp. Lý do tôi nói điều này là đôi khi cùng một mã lỗi xuất hiện trong các ngữ cảnh khác nhau, vì vậy nó không phải là mã lỗi chính nó có thể được sử dụng để xác định xem nó có quan trọng hay không chính bối cảnh đó.

4

"Quan trọng" phụ thuộc vào những gì bạn đang làm với tệp.

Bất kỳ mã lỗi nào cũng có thể do lỗi lập trình hoặc một số điều đặc biệt trên máy đang chạy; Tôi không nghĩ rằng đó là một sự khác biệt quan trọng trong xử lý lỗi.

Đối với các lỗi bạn không xử lý cụ thể (các lỗi "không xác định"), chỉ cần giả định tệp không được tạo và xử lý trường hợp đó. Nó không quan trọng Tại sao nó không được tạo ra, chỉ cần giả sử nó không phải là và tài khoản cho kịch bản đó. Tùy thuộc vào những gì mã của bạn đang làm và bao nhiêu nỗ lực bạn muốn đưa vào kịch bản này, nó có thể gây tử vong hay không.

Lưu ý rằng vi phạm truy cập không phải là điều mà GetLastError() biết, vì vậy tôi không hiểu mức độ liên quan của nó đối với câu hỏi của bạn.

+0

Trên thực tế, tôi * đã * nhận được các vi phạm truy cập từ 'GetLastError'. Không phải với 'CreateFile' tất nhiên, nhưng từ các chức năng khác (tôi không nhớ cái nào, thật không may). Nhưng dù sao thì tốt, +1. – Mehrdad

+0

"Vi phạm truy cập trở lại từ getlasterror" có nghĩa là gì? – tenfour

+0

Điều đó có nghĩa là tôi đã nhận được 'ERROR_NOACCESS' được trả về từ GetLastError, nhưng tôi không nhớ tôi đã nhận được hàm nào. – Mehrdad