Tôi biết hai phương pháp xử lý Ngoại lệ, cho phép xem xét chúng.Xử lý ngoại lệ: Hợp đồng và Cách tiếp cận đặc biệt
Cách tiếp cận hợp đồng.
Khi một phương pháp không thực hiện những gì nó nói nó sẽ làm trong tiêu đề phương thức, nó sẽ ném một ngoại lệ. Vì vậy, phương pháp "hứa hẹn" rằng nó sẽ làm các hoạt động, và nếu nó không vì một lý do nào đó, nó sẽ ném một ngoại lệ.
Cách tiếp cận vượt trội.
Chỉ ném ngoại lệ khi có điều gì đó thực sự kỳ lạ xảy ra. Bạn không nên sử dụng ngoại lệ khi bạn có thể giải quyết tình huống bằng luồng điều khiển thông thường (Nếu phát biểu). Bạn không sử dụng Ngoại lệ cho luồng kiểm soát, như bạn có thể trong cách tiếp cận hợp đồng.
Cho phép sử dụng cả hai phương pháp trong các trường hợp khác nhau:
Chúng tôi có một lớp khách hàng mà có một phương pháp gọi là OrderProduct.
cách tiếp cận hợp đồng:
class Customer
{
public void OrderProduct(Product product)
{
if((m_credit - product.Price) < 0)
throw new NoCreditException("Not enough credit!");
// do stuff
}
}
phương pháp đặc biệt:
class Customer
{
public bool OrderProduct(Product product)
{
if((m_credit - product.Price) < 0)
return false;
// do stuff
return true;
}
}
if !(customer.OrderProduct(product))
Console.WriteLine("Not enough credit!");
else
// go on with your life
Ở đây tôi thích cách tiếp cận đặc biệt, vì nó không phải là thực sự vượt trội mà khách hàng không có tiền giả định ông không giành chiến thắng trong xổ số .
Nhưng đây là một tình huống mà tôi nhầm lẫn về kiểu hợp đồng.
vượt trội:
class CarController
{
// returns null if car creation failed.
public Car CreateCar(string model)
{
// something went wrong, wrong model
return null;
}
}
Khi tôi gọi một phương thức gọi là CreateCar, tôi chết tiệt wel mong đợi một trường hợp xe thay vì một số con trỏ null tệ hại, mà có thể tàn phá đang chạy của tôi một chục dòng sau. Do đó, tôi thích hợp đồng với điều này:
class CarController
{
public Car CreateCar(string model)
{
// something went wrong, wrong model
throw new CarModelNotKnownException("Model unkown");
return new Car();
}
}
Bạn sử dụng kiểu nào? Bạn nghĩ gì là cách tiếp cận chung nhất cho Ngoại lệ?
+1 cho ví dụ về trả lại kết quả bằng 0 hoặc 0. Thay vì làm cho mã rõ ràng hơn, hàm trả về null hoặc -1 buộc người viết của phương thức gọi để biết cách phương thức được gọi chọn báo cáo một kết quả không chuẩn. Trường hợp ngoại lệ là một cách tiếp cận hợp pháp, rõ ràng hơn, trong đó người gọi có thể coi điều khoản được gọi là hộp đen thay đổi (có thể). Tất cả những người được mời phải biết rằng nó sẽ phải xử lý một ngoại lệ, không phải hôm nay là ngày hôm nay và ngày hôm sau là Integer.MIN_VALUE. – rajah9