2010-03-12 43 views
10

Ưu điểm và nhược điểm của việc sử dụng một trong các cách tiếp cận sau đây để kéo ra một đôi từ một đối tượng là gì? Ngoài các sở thích cá nhân, các vấn đề tôi đang tìm kiếm phản hồi về bao gồm dễ gỡ lỗi, hiệu suất, bảo trì, v.v.ưu và nhược điểm của TryCatch so với TryParse

public static double GetDouble(object input, double defaultVal) 
{ 
    try 
    { 
     return Convert.ToDouble(input); 
    } 
    catch 
    { 
     return defaultVal; 
    } 
} 

public static double GetDouble(object input, double defaultVal) 
{ 
    double returnVal; 
    if (double.TryParse(input.ToString(), out returnVal)) 
    { 
     return returnVal; 
    } 
else 
    { 
     return defaultVal; 
    } 
} 

Trả lời

17
  • TryParse sẽ nhanh hơn so với đánh bắt một ngoại lệ
  • TryParse chỉ ra một cái gì đó dự kiến ​​ - không có gì đặc biệt đang xảy ra ở đây, nó chỉ là bạn nghi ngờ dữ liệu của bạn có thể không có giá trị.
  • TryParse không sử dụng xử lý để kiểm soát bình thường ngoại lệ chảy

Về cơ bản, đi với TryParse :)

Bằng cách này, mã của bạn có thể được viết lại như sau:

public static double GetDouble(object input, double defaultVal) 
{ 
    double parsed; 
    return double.TryParse(input.ToString(), out parsed)) ? parsed : defaultVal; 
} 
+0

GM Jon, là gì thực hiện nội bộ của tryparse()? Có phải như sau: thử { Phân tích cú pháp(); trả về true; } bắt (Ngoại lệ) { trả về false; } – Sunil

+2

TryParse phôi thành String (thực sự là char *), cố gắng phân tích chuỗi đó thành Số (thông qua so sánh nhân vật), sau đó thực hiện các kiểm tra khác (phạm vi, v.v.) để đảm bảo Số là loại đúng. Không có một khối thử cố gắng xung quanh nó :) –

4

TryParse hiệu quả hơn hiệu suất TryCatch khôn ngoan.

2

Có các phương thức Parse ném ngoại lệ vào đầu vào xấu là một lỗi thiết kế. Dữ liệu nhập sai là được mong đợi là hành vi khi bạn nhận dữ liệu từ người dùng. Ngoại lệ ném là tốn kém, nó không phải là một cái gì đó bạn muốn xảy ra thường xuyên trong mã của bạn.

Rất may, Microsoft đã nhận ra lỗi của họ và thêm các phương thức TryParse. TryParse không không phải chịu chi phí của ngoại lệ ném vào đầu vào xấu, nhưng nhược điểm là nó phải trả lại hai phần dữ liệu, do đó, nó cảm thấy một chút khó xử khi sử dụng.

Bây giờ nếu họ không tạo ra sự phân tích cú pháp Parse bị hỏng ngay từ đầu, TryParse sẽ được gọi là Phân tích cú pháp.

1

TryParse là nhanh hơn và thường tốt hơn nhưng tôi sẽ đề nghị phương pháp TryCatch trong khuôn khổ và back-end lập trình bởi vì bạn có thể cung cấp thêm thông tin cho khách hàng về lỗi:

public double GetAge() 
{ 
    try 
    { 
     var input = _dataProvider.GetInput(); 
     return Convert.ToDouble(input); 
    } 
    catch(Exception ex) 
    { 
     throw new MyBackendException(ex); 
    } 
} 
+0

Bạn vẫn có thể sử dụng TryParse và tăng ngoại lệ của riêng bạn trên dữ liệu xấu. Trong thực tế, bạn nên làm theo cách đó, cho các mục đích truy tìm nếu không có gì khác. –

+0

Ok, nhưng bạn sẽ chỉ có một thông báo chung về "dữ liệu xấu" và bạn sẽ mất thông tin về lý do dữ liệu xấu. Thông tin trong một InvalidCastException hoặc một FormatException hoặc. Lập trình trên một khuôn khổ nhất định Tôi muốn càng nhiều càng tốt thông tin về một lỗi. Dù sao, khi dữ liệu xấu có thể đến từ một dịch vụ web hoặc từ lưu trữ, nó không phải là "hành vi mong đợi" và ngoại lệ IMO phải được ném. – onof

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