2012-10-10 10 views
14

Mam następujący kod, który pobiera rekordy Szczegóły po kliknięciu na siatce tabeli:Jakiego wyjątku powinienem użyć w przypadku "No Record Found"? (C#)

public ActionResult City(string rk) 
{ 
    try 
    { 
     var city = _cityService.Get("0001I", rk); 
     if (city == null) 
     { 
      throw new ServiceException("", "Error when fetching city " + rk); 
     } 
    } 
} 

Jakie wyjątku należy używać do tego „Nie znaleziono rekordu” problem? Rozumiem, że istnieją różne rodzaje wyjątków, ale nie jestem pewien, który z nich byłby odpowiedni, a nawet, czy poprawnie to koduję.

+4

Utwórz własny wyjątek. – Jeremy

+0

Można również utworzyć własny wyjątek i wyrzucić go. Podobnie jak RecordNotFoundException. –

+0

Chyba jest to metoda 'Controller'. Jeśli chcesz poinformować użytkownika, że ​​rekord nie został znaleziony, możesz utworzyć specjalny widok 'View' i zwrócić go zamiast rzucić wyjątek. – Patko

Odpowiedz

22

KeyNotFoundException byłby to rozsądny wybór, i byłoby zgodne the Microsoft guideline do:

Rozważmy rzucanie istniejących wyjątków znajdujących się w przestrzeni nazw systemowych zamiast tworzenia własnych typów wyjątków.

Jednak można rozważyć stworzenie własnej Exception typu if (ponownie z wytycznymi firmy Microsoft):

... masz stan błędu, który może być obsługiwany programowo w inny sposób niż jakakolwiek inna istniejące wyjątki.

Jeśli utworzysz własny Exception, powinieneś postępować zgodnie z guidelines for designing custom exceptions, np. powinieneś sprawić, by Twój numer seryjny był Exception.

+0

Joe, twoje linki są martwe. [Oto artykuł] (https://msdn.microsoft.com/en-us/library/ms229064 (v = vs.100) .aspx) Myślę, że pierwotnie linkowałeś do. Nie jest on utrzymywany, więc [tutaj jest nowy artykuł] (https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/exceptions), który nie wspomina o serializacji. Nie wiedziałem, do którego z nich wolisz linkować. – johnnyRose

+0

I dla przyszłych czytelników [tutaj jest powiązane pytanie] (https://stackoverflow.com/q/4791823/2840103). – johnnyRose

4

Powinieneś stworzyć własny wyjątek i może w tym przypadku nazwać go RecordNotFoundException.

+0

Nie myślałem o tym jako opcji. Jak mogę to zrobić. Czy musi odziedziczyć? –

+1

@Anne Tak. Dziedzicz klasę wyjątków. –

0

Tworzenie własnego wyjątku jest dość łatwe. Wystarczy utworzyć klasę, nadać jej nazwę, rozszerzyć Exception lub inny typ wyjątku i dostarczyć konstruktorów, których potrzebujesz (po prostu wywołując konstruktory bazowe Exception).

Jeśli chcesz dodać więcej, możesz, ale często nie musisz.

Jeśli tworzysz kilka wyjątków dla swojego projektu, możesz utworzyć podstawowy wyjątek (który rozszerza wyjątek), który obejmuje wszystkie wyjątki. To jest coś, co możesz zrobić, pisząc bibliotekę. Umożliwiłoby to komuś przechwycenie określonego wyjątku lub wyjątku wyrzuconego z biblioteki lub dowolnego wyjątku.

public class MySuperAwesomeException : Exception 
{ 
    public MySuperAwesomeException() : base() { } 
    public MySuperAwesomeException(string message) : base(message) { } 
    public MySuperAwesomeException(string message, Exception innerException) 
     : base(message, innerException) { } 
} 
+0

Powinieneś uczynić niestandardowy wyjątek serializowalnym: zobacz http://msdn.microsoft.com/en-us/library/vstudio/ms229064(v=vs.100).aspx – Joe

+0

co to jest 'base()' w powyższym kodzie ? – Jogi

+0

@RehanKhan Wywołuje konstruktor klasy podstawowej ... – Servy

Powiązane problemy