2012-08-15 9 views
9

Tôi đã tìm kiếm câu trả lời cho câu hỏi của mình nhưng không thể tìm thấy câu trả lời. Xin lỗi nếu câu trả lời là có và tôi đang nhân bản!Thử/bắt đơn giản không sử dụng ngoại lệ

Tôi tiếp tục nhìn thấy try/code bắt như .....

try 
{ 
    //Do whatever 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

nào sẽ dẫn đến một cựu cảnh báo không bao giờ được sử dụng.

Vì vậy, câu hỏi của tôi là ... Mặc dù cũ không bao giờ được sử dụng là có bất kỳ lợi ích trong việc kê khai? Tôi đã nói rằng có lẽ nó thêm chi tiết vào dấu vết ngăn xếp? Đôi khi tôi thấy bắt (Ngoại lệ) mà dừng cảnh báo nhưng những lợi ích này mang lại, nếu có? Nếu tôi là để viết những dòng này và không sử dụng các ngoại lệ trong bất kỳ cách nào tôi sẽ không khai báo cũ ...

try 
{ 
    //Do whatever 
} 
catch 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

Không phải là một vấn đề lớn nhưng nó sẽ là tốt để biết chắc chắn!

Cảm ơn

Fred

+0

Có thể bạn muốn viết ngoại trừ thực tế để một khúc gỗ, do đó bạn có thể gỡ lỗi nó sau này, ngay cả khi bạn không bao giờ hiển thị nó cho người dùng. – Rup

+0

Có nếu bạn không quan tâm đến những gì đã xảy ra (tùy thuộc vào bạn), bạn có thể thực hiện với việc không khai báo ngoại lệ – bizl

+0

vì bạn có thể có một số 'catch', bạn có thể viết' catch (BadFormatException) {/ * bad format ở đây * /} catch (Exception ex) {/ * lỗi không xác định ở đây * /} '. Tôi nghĩ rằng đó sẽ là một lý do để sử dụng 'catch (Exception)' – Default

Trả lời

10

Bạn có thể sử dụng mẫu sau, vẫn tuyên bố loại ngoại lệ cụ thể, mà không có một biến, để đảm bảo ngoại lệ có cấu trúc xử lý (SEH) vẫn xảy ra:

try 
{ 
    //Do whatever 
} 
catch (IOException) 
{ 
    MessageBox.Show("Oops, something went wrong in the IO!"); 
} 
catch (Exception) 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

Đây không phải là một thực tế tôi thường sử dụng, vì tôi có thể sẽ ghi lại chi tiết ngoại lệ nếu không phải rethrowing nó.

+0

Tôi không có ý tưởng bạn có thể bắt một ngoại lệ mà không cần phải gán nó vào một biến (ví dụ: "IOException ex") cho đến khi tôi bắt gặp điều này. Cảm ơn bạn! –

1

Bạn có thể sử dụng ex biến để sử dụng sau này, trong đó có khai thác gỗ, tin nhắn, vv

try 
{ 
    //Do whatever 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 

} 

Giả sử bạn muốn đăng nhập ngoại lệ của bạn, vì vậy mà sau này các nhà phát triển có thể xem nhật ký và xác định điều gì đã xảy ra. Trong trường hợp đó, ex sẽ giữ tất cả các chi tiết cần thiết cần thiết để ghi nhật ký. ví dụ. StackTrace, tin nhắn, InnerException nếu có, vv

Đối với câu hỏi của bạn:

Mặc dù cũ không bao giờ được sử dụng là có bất kỳ lợi ích trong việc kê khai?

Nếu bạn không định sử dụng, thì không có lợi nào khi khai báo.

Tôi được thông báo rằng có thể nó sẽ thêm chi tiết vào dấu vết ngăn xếp?

Tôi không chắc chắn, nhưng tôi nghĩ là không. Nếu bạn định nghĩa một cái, thì nó sẽ chứa Dấu vết ngăn xếp của ngoại lệ, nhưng nó sẽ không thêm bất cứ thứ gì vào nó.

Thỉnh thoảng tôi thấy bắt (Ngoại lệ) dừng cảnh báo nhưng điều gì sẽ mang lại lợi ích cho , nếu có?

Nếu bạn muốn tái ném ngoại lệ sử dụng throw từ khóa, bạn có thể sử dụng catch(Exception)

+0

Xin lỗi có lẽ tôi nên nói. Tôi hiểu lý do tại sao bạn sẽ có tuyên bố và các loại khác nhau của exceoptions bạn có thể bắt. Những gì tôi không biết là nếu có bất kỳ lợi ích cho việc kê khai nếu bạn không sử dụng nó. Có vẻ vô nghĩa với tôi nhưng có điều gì đó tôi đang thiếu? – Fred

0

Không, không có điểm trong tuyên bố nó, trừ khi bạn thực sự sử dụng nó.

3

Loại trừ ngoại lệ thường là biểu mẫu không hợp lệ ... để chúng di chuyển lên ngăn xếp.

Về "thêm chi tiết", hãy sửa lại ngoại lệ bằng cách sử dụng throw để giữ lại dấu vết ngăn xếp nếu không bạn sẽ mất chi tiết. Một lần nữa, thay thế là có để không bắt nó ở tất cả.Nếu bạn không có bất kỳ sử dụng cho các trường hợp ngoại lệ (phục hồi, thư giãn, vv), rất có thể là không có một lý do chính đáng để bắt nó.

Xem: What is the proper way to re-throw an exception in C#?

Xem thêm: "Back to Basics - Exceptions"

3

Điều quan trọng cần lưu ý rằng có một sự khác biệt trong hai khối mã được đăng của bạn. catch (Exception ex) sẽ chỉ bắt ngoại lệ do CLR xác định (các trường hợp phát sinh từ Exception). catch một mình sẽ bắt bất cứ điều gì - bao gồm cả ngoại lệ không được quản lý mà CLR đã không bắt hoặc bọc chính nó.

Nếu bạn muốn tránh cảnh báo trình biên dịch của bạn mà không thay đổi hành vi của mã này, hoặc nếu bạn muốn tránh các cảnh báo trong khi vẫn bắt một loại ngoại lệ cụ thể, bạn có thể sử dụng thay vì:

catch (Exception) 
{ 
} 

Các lợi ích ở đây là bạn có thể cụ thể: ví dụ: catch (SqlException). Nếu bạn không sử dụng biến sau đó tuyên bố đưa ra cảnh báo, nhưng hành vi kiểu cụ thể vẫn hữu ích.

Bất kể, tuyên bố ngoại lệ không thêm bất kỳ thứ gì vào thông tin (theo dõi ngăn xếp hoặc theo cách khác), trừ khi bạn bao bọc và/hoặc-rethrow ngoại lệ một cách rõ ràng. (Ngẫu nhiên, không sử dụng throw ex để rethrow, vì này không mất thông tin:. Chỉ cần sử dụng throw)

1

Nếu bạn thực sự không muốn làm bất cứ điều gì với ngoại lệ, bạn cũng có thể làm như vậy để tránh sự biên dịch cảnh báo:

catch (Exception) 
{ 
    // Stick our head in the sand 
} 

(or just catch)

1

Đó là tất cả về các nhà phát triển và khả năng của mình để thực hiện thích hợp khai thác gỗ/gỡ lỗi trong một thuật ngữ sau ...

này:

catch (Exception ex) 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

dễ dàng có thể được chuyển đổi sang

catch (Exception ex) 
{ 
    Log.Append(ex); 
    MessageBox.Show("Oops, something went wrong. Please check the Log file."); 
} 

đôi khi nó chỉ đơn thuần là ở đó để gỡ lỗi khi bạn chạy từng dòng và bạn có thể có điểm ngắt trên MessageBox.Show dòng và đọc biến số ex.

Nó có đó là tính hữu dụng, nhưng, vào thời điểm biên soạn, nếu bạn không sử dụng nó, bạn sẽ nhận được một cảnh báo rằng biến ex được khai báo và không được sử dụng, vì vậy, bạn có thể theo dõi tất cả những người và tàn lụi Log hoặc xóa nó.

Một lần nữa, đó là tất cả về sự lựa chọn của lập trình viên, và ... biến không sử dụng không phải là vấn đề đối với chương trình kết thúc.

0

Exception ex sẽ là tham chiếu đến đối tượng ngoại lệ thời gian chạy có thể mang lại nhiều lợi thế. Bản thân bạn với tư cách là nhà phát triển có thể đăng nhập vào tệp văn bản hoặc gửi báo cáo cho chính mình.

Tính đến tài liệu của MSDN:

Nếu bạn muốn tái ném ngoại lệ hiện xử lý bởi một mệnh đề catch tham số-ít hơn, sử dụng câu lệnh ném mà không đối số.

http://msdn.microsoft.com/en-us/library/0yd65esw%28v=vs.80%29.aspx