2010-06-24 58 views
9

Có bất kỳ cách nào có lợi cho return giá trị sau throw trong trường hợp ngoại lệ không? Nếu không, câu lệnh return có thể bị loại bỏ và có thể xóa lỗi biên dịch C4715: not all control paths return a value không?Trả lại sau khi ném ngoại lệ

Xin cảm ơn trước.

Edit: (mẫu mã)

for (ushort i = 0; i < itsNumUnits; ++i) 
    if (unitFormation[i] == unit) 
    { 
     return unitSetup[i]; 
    } 
    else 
     throw unit; 

return 0; 
+2

Nếu câu lệnh cuối cùng trong thói quen của bạn là 'ném' và bạn vẫn nhận được cảnh báo, có thể bạn nên đăng mẫu mã và nói trình biên dịch bạn đang sử dụng. –

+0

Những gì tôi đã có trong tâm trí là một cái gì đó của loại mà tôi đã thêm vào câu hỏi ... Xin lỗi đã không thêm một mẫu trước. –

+0

Cảnh báo trình biên dịch không phải là vấn đề với ngôn ngữ hoặc tiêu chuẩn, nhưng với trình biên dịch. Tôi giả sử bạn đang sử dụng một số phiên bản của Visual C++ từ các hình thức thông báo lỗi, nhưng nó có thể giúp đỡ để biết cái nào. –

Trả lời

7

Không cần phải trả lại một giá trị sau khi ngoại lệ ném. Nếu bạn gặp lỗi này, bạn nên kiểm tra các đường dẫn mà mã của bạn có thể truy cập mà không cần ném ngoại lệ, ví dụ:

if (something) 
    throw Exception; 
else 
    return value; 

Không trả lại giá trị tại các chi nhánh "khác" của "nếu" sẽ gây ra một lỗi biên dịch vì ngoại lệ có thể hoặc không thể được ném tùy thuộc vào giá trị của something.

+3

MSVC sẽ cung cấp cho C4715: không phải tất cả các đường dẫn điều khiển đều trả về giá trị cho đường dẫn nếu trong mã của bạn, mặc dù đường dẫn này không thể trả lại vì nó luôn luôn ném. – Pait

2

tự ném việc chấm dứt thực thi chức năng. Nhưng nếu hàm của bạn trả về một giá trị, và ngoại lệ không được ném, bạn sẽ phải chăm sóc trả về một giá trị. Ví dụ:

bool foo(bool _flag) throw(...) 
{ 
    if (_flag) 
    { 
     throw "foo is throwing an exception"; 
    } 
    return true; 
} 
-1

Sau khi ném bạn sẽ bị bắt (đoạn mã bên dưới không được thực thi). Khối duy nhất được thực hiện là cuối cùng.

Nếu bạn muốn đạt được một cái gì đó giống như những gì bạn mô tả ở trên đi cho một cái gì đó như thế này:

object returnVal = null; // the bad 
try 
{ 
    //some code here 
    throw new Exception(); // something bad happened 
    //some more code 
    returnVal = new object(); // the good 
} 
catch(Exception ex) 
{ 
    // log, try to recover etc. 
    // maybe it`s a good idea not to throw it away if you can handle it here! 
} 
return returnVal; // either the good or the bad (never the ugly!) 

C# tương đương với cảnh báo là một lỗi biên dịch như vậy trong bất kỳ cách nào tôi không nghĩ rằng một ý tưởng tốt là để loại bỏ cảnh báo trình biên dịch nhưng để cố gắng giải quyết chúng.

Regards ...

+0

Không có 'cuối cùng' trong C++, và câu hỏi không đề cập đến việc bắt ngoại lệ. Và nếu trình biên dịch tạo ra một cảnh báo do không có 'return' sau một lệnh 'throw' vô điều kiện, thì cảnh báo là không có thật. –

+5

Mã rất xấu cho C++, chúng tôi không có 'đối tượng',' null' hoặc 'mới' trên toàn bộ địa điểm ... –

+0

Thực sự là C# nhưng tôi nghĩ thậm chí còn có một mức độ nhỏ ở mức độ ... – Padel

0

Tương đương gần nhất để có thể "trở lại" một giá trị cũng như ném một ngoại lệ là khi chức năng ghi vào một con trỏ hoặc tham chiếu đối tượng trước khi ném ngoại lệ:

void my_func(int& ret) 
{ 
    ret = 0; 

    for (ushort i = 0; i < itsNumUnits; ++i) { 
     if (unitFormation[i] == unit) { 
      ret = unitSetup[i]; 
      return; 
     } 
     else { 
      throw unit; 
     } 
    } 
} 

Mẫu này, tuy nhiên, dễ bị lỗi và hiếm khi hữu ích. Hãy suy nghĩ cẩn thận trước khi sử dụng nó.

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