2012-04-14 33 views
5

Thỉnh thoảng khi tôi lập trình bằng C++/C, tôi sẽ gọi cùng một hàm nhiều lần và tôi tự hỏi cách hiệu quả nhất để kiểm tra lỗi cho tất cả các cuộc gọi đó là gì? Sử dụng các câu lệnh if else chiếm nhiều mã và trông xấu xí. Tôi đã nghĩ ra cách kiểm tra lỗi của riêng mình, có lẽ có cách tốt hơn tôi nên sử dụng.Lỗi khi kiểm tra nhiều cuộc gọi hàm

int errs[5] = {0}; 
errs[0] = functiona(...); 
errs[1] = functiona(...); 
... 
errs[5] = functiona(...); 
for (int i = 0; i < 5; i++) 
{ 
    if (err[i] == 0) 
    MAYDAY!_wehaveanerror(); 
} 

Lưu ý: Tôi hiểu rằng việc sử dụng trycatch có thể là tốt hơn cho C++ vì nó sẽ giải quyết vấn đề này bằng cách ném một ngoại lệ về lỗi đầu tiên, nhưng vấn đề với điều đó là nó không tương thích với rất nhiều các hàm trả về mã lỗi như API Windows. Cảm ơn!

+1

Haha, đã cập nhật câu hỏi của tôi :) – user99545

+2

Tại sao bạn không muốn biết càng sớm càng tốt khi xảy ra lỗi và kiểm tra từng mã trả lại khi bạn nhận được mã? Sử dụng phương pháp của bạn, bạn có thể tạo ra một chuỗi các lỗi, và chỉ tìm hiểu về đầu tiên. –

+0

Lặp lại danh sách các paramaters bạn sẽ vượt qua, gọi hàm với tham số của iteration đó, thiết lập "bool" error thành true khi phát hiện lỗi đầu tiên và kết thúc vòng lặp ngay tại đó. – DavidO

Trả lời

2

Nếu ... NẾU chức năng có cơ hội để ném một lỗi khác nhau mà bạn cũng nên thêm một nắm bắt tất cả.

struct my_exception : public std::exception { 
    my_exception(int); /* ... */ }; 

int main() 
{ 
    try 
    { 
     int e; 
     if ((e = function()) != SUCCESS) { throw my_exception(e); } 
     if ((e = function()) != SUCCESS) { throw my_exception(e); } 
     if ((e = function()) != SUCCESS) { throw my_exception(e); } 
    } 
    catch (my_exception & e) 
    { 
     std::cerr << "Something went wrong: " << e.what() << "\n"; 
    } 
    catch (...) 
    { 
     //Error Checking 
    } 
} 
5

Bạn có thể viết một số giả C++ như thế này:

struct my_exception : public std::exception { 
    my_exception(int); /* ... */ }; 

int main() 
{ 
    try 
    { 
     int e; 
     if ((e = function()) != SUCCESS) { throw my_exception(e); } 
     if ((e = function()) != SUCCESS) { throw my_exception(e); } 
     if ((e = function()) != SUCCESS) { throw my_exception(e); } 
    } 
    catch (my_exception & e) 
    { 
     std::cerr << "Something went wrong: " << e.what() << "\n"; 
    } 
} 
+0

Hoặc bạn có thể bọc chức năng Windows API bằng một lớp mỏng chuyển đổi mã lỗi thành ngoại lệ. Borland Delphi đã làm điều này 15 năm trước, nó đã làm việc rất tốt và vẫn hoạt động rất tốt. –

0

Nếu bạn gọi cùng một chức năng lặp đi lặp lại, cách ngắn gọn nhất có thể là sử dụng macro. Tôi sẽ đề nghị một cái gì đó như:

#define CHECKERROR(x) if(x == 0) wehaveanerror() 

CHECKERROR(function(...)); 
CHECKERROR(function(...)); 

Rõ ràng, macro này sẽ rất cụ thể cho các chức năng và lỗi cụ thể xử lý tham gia, vì vậy nó có thể là khôn ngoan để undef nó sau khi những cuộc gọi.

0

Làm nó nhiều hơn trường học cũ, nhưng giữ w/phản ứng lỗi ban đầu nhưng trả lời càng sớm càng một lỗi xảy ra w/o nhìn xấu xí:

#define callcheck(r) if ((r)==0) MAYDAY!_wehaveanerror() 

callcheck(functiona(...)); 
callcheck(functiona(...)); 
... 
1

gì về xử lý việc kiểm tra trong một chức năng?

void my_function() { 
    if (!create_window()) 
    throw Error("Failed to create window"); 
} 

int main() { 
    try { 
    my_function(); 
    } catch (const Error& e) { 
    cout << e.msg << endl; 
    } catch (...) { 
    cout << "Unknown exception caught\n" 
    } 

    return 0; 
} 
Các vấn đề liên quan