Rzucanie ArgumentNullException w konstruktorze?

Dla konstruktora z pojedynczym parametrem, czy można wrzucić ArgumentNullException do konstruktora, jeśli parametr jest null / empty? A może należy go wrzucić do metody, która faktycznie używa argumentu? Dzięki.

Author: Ryan Peters, 2010-09-02

4 answers

Tak, jeśli jest to całkowicie istotne, to wyrzuć wyjątek. Nie należy * wyrzucać wyjątku później.

Zawsze pamiętaj o "zasada wczesnego niepowodzenia" . Koncepcja jest teraz nieudana, więc nie tracisz czasu na debugowanie ani nie doświadczasz nieoczekiwanej funkcjonalności systemu.

Alternatywnie możesz również rzucić ArgumentException dla "" i ArgumentNullException dla null. W obu przypadkach upewnij się, że rzuciłeś prawidłowy Komunikat o wyjątku.


Zawsze dobre odniesienie artykuł do zarządzania wyjątkami: dobre zasady zarządzania wyjątkami


Uwaga na to, co powiedział @ Steve Michelotti (bo jestem wielkim fanem Codecontractów)

Contract.Requires<ArgumentNullException>(inputParemeter!= null, "inputparameter cannot be null");
Contract.Requires<ArgumentException>(inputParemeter!= "", "inputparameter cannot be empty string");

Alternatywnie

Contract.Requires<ArgumentNullException>(!string.IsNullOrEmpty(inputParemeter), "inputparameter cannot be null or empty string");
 57
Author: Nix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-02 18:20:59

Wrzucenie go do konstruktora jest w porządku - jest kilka klas w. NET framework, które to robią. Dodatkowo sprawdź code contracts w tym celu.

 17
Author: Steve Michelotti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-02 18:07:17

Z tego, jak to brzmi, przekazujesz parametr do konstruktora, który ma być przechowywany przez klasę do użycia w innej metodzie później. Jeśli nie używasz argumentu w konstruktorze, prawdopodobnie powinieneś pomyśleć o przeniesieniu argumentu do parametru metody, która jest w rzeczywistości używającej go.

 4
Author: Steve Danner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-02 18:07:15

Umieściłbym czek w właściwości, którą ustawiłeś, gdy wywoływany jest konstruktor... W ten sposób wyjątek zostałby wyrzucony we wszystkich przypadkach.

 1
Author: F.B. ten Kate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-02 18:07:50