2010-09-12 39 views
16

Thực hành tốt nhất để ném ngoại lệ nếu không có mục nhập nào được tìm thấy trong db?ASP.NET MVC - Trường hợp ném ngoại lệ?

// CONTROLLER 
public ActionResult Edit(int categoryId, int id) 
{ 
    Product target = Products.GetById(id); 
    if (target == null) throw new HttpException(404, "Product not found"); 

    return View("Edit", target); 
} 

// REPOSITORY 
public Product GetById(int id) 
{ 
    return context.Products.FirstOrDefault(x => x.productId == id); 
} 

hoặc

// CONTROLLER 
public ActionResult Edit(int categoryId, int id) 
{ 
    return View("Edit", Products.GetById(id)); 
} 

// REPOSITORY 
public Product GetById(int id) 
{ 
    Product target = context.Products.FirstOrDefault(x => x.productId == id); 
    if (target == null) throw new HttpException(404, "Product not found with given id"); 

    return target; 
} 

Trả lời

19

Không bao giờ ném một số HttpException từ một kho lưu trữ ... đó là mức trừu tượng sai. Nếu bạn không muốn kho của bạn để trở null, làm một cái gì đó như thế này:

// CONTROLLER 
public ActionResult Edit(int categoryId, int id) 
{ 
    try { 
     Product target = Products.GetById(id); 
    } 
    catch(ProductRepositoryException e) { 
     throw new HttpException(404, "Product not found") 
    } 

    return View("Edit", target); 
} 

// REPOSITORY 
public Product GetById(int id) 
{ 
    Product target = context.Products.FirstOrDefault(x => x.productId == id); 
    if (target == null) throw new ProductRepositoryException(); 

    return target; 
} 

kho của bạn không nên biết gì về HTTP, nhưng điều khiển của bạn có thể biết về kho. Vì vậy, bạn ném một ngoại lệ lưu trữ từ kho lưu trữ, và "dịch" mà thành một ngoại lệ HTTP trong bộ điều khiển.

+0

Nhưng sau đó tôi phải tạo ngoại lệ tùy chỉnh: (? – ebb

+6

Có bạn làm. Và đó là những gì bạn nên * làm. – blockhead

+0

Tôi sẽ chỉ tạo một ngoại lệ tùy chỉnh Sau đó, hãy đặt tên là "NotFoundException". Cảm ơn bạn đã trả lời :) – ebb

0

tôi sẽ ném HttpException trong bộ điều khiển, và trở null từ kho.

+1

Trả về giá trị rỗng từ kho lưu trữ .. điều đó có ý nghĩa - bạn có thể đi sâu hơn một chút không? – ebb

+0

Tôi có nghĩa là '... OrDefault();' ... – Nate

3

Không ném một HttpException trong Kho lưu trữ, vì bạn có thể muốn sử dụng lại mã đó trong tương lai trong môi trường không phải là Http. Ném ngoại lệ ItemNotFound của riêng bạn nếu bạn yêu cầu ít nhất một mục và xử lý ngoại lệ đó trong Controller, hoặc trả về null và xử lý điều đó.

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