Các hit hiệu suất có lẽ là không đáng kể, như được giải thích trong câu trả lời này .
Vì vậy, hãy đi với ý tưởng rằng hiệu suất không phải là một vấn đề. Bạn đang ném System.Exception
, chỉ để di chuyển thực hiện vào catch
mệnh đề . Ném một cái BadControlFlowThatShouldBeRewrittenException
có lẽ sẽ là quá mức cần thiết mặc dù.
Hãy phá vỡ điều này. Chúng ta có:
- Phương thức
GetDataFromServer
(tên phương thức phải là PascalCase trong C #), có thể có thể ném ngoại lệ hoặc trả về a bool
.
- Nếu kết quả là
true
, chạy ProcessData
.
- Trả lại
null
nếu không.
Có vẻ như phương thức mà mã này được viết, chỉ đơn giản là làm quá nhiều thứ. GetDataFromServer
trả về một giao bool
diện trông giống như một lỗi thiết kế, tôi đang mong đợi phương thức đó trả về dữ liệu mà nó nhận được từ máy chủ , một số IEnumerable<SomeType>
có chứa 0 hoặc nhiều mục - tức là đường dẫn hạnh phúc trả về n mục trong đó n> 0 , không hạnh phúc đường dẫn trả về 0 mục và đường dẫn không vui sẽ xuất hiện với một ngoại lệ chưa được xử lý, bất kể đó là gì.
Điều đó thay đổi phương thức trông như thế nào, khá nhiều - một lần nữa thật khó để biết liệu điều này có hợp lý hay không, bởi vì bài đăng gốc chỉ có một điểm thoát (và do đó sẽ không biên dịch, vì không phải tất cả các đường dẫn mã đều trả về một giá trị ), vì vậy Đây chỉ là một phỏng đoán hoang dã:
try
{
var result = GetDataFromServer();
return ProcessData(result);
}
catch
{
return null;
}
Ở đây bạn nhìn vào ProcessData
và thấy rằng nó đang lặp lại result
và trả về null
nếu không có mục nào trong IEnumerable
.
Bây giờ tại sao phương thức trở lại null
? Máy chủ bị sập? Có một lỗi trong truy vấn? Chuỗi kết nối đang sử dụng thông tin sai? Bất cứ khi nào GetDataFromServer
nổ tung với một ngoại lệ mà bạn không mong đợi, bạn sẽ nuốt nó, đẩy nó xuống dưới thảm và trả lại một null
giá trị. Tôi khuyên bạn nên nắm bắt các ngoại lệ cụ thể trong trường hợp này và ghi nhật ký mọi thứ khác; cách gỡ lỗi sẽ dễ dàng hơn nhiều theo cách đó.
Với một catch
mệnh đề chung không nắm bắt được ngoại lệ, sẽ rất khó để chẩn đoán bất cứ điều gì. Thay vào đó tôi sẽ làm điều này tối thiểu:
catch(Exception e)
{
return null;
}
Bây giờ bạn ít nhất có thể phá vỡ và kiểm tra e
nếu mọi thứ đi sai.
TL; DR : Không, ném và bắt ngoại lệ cho kiểm soát dòng chảy không phải là một ý tưởng tốt.