Door
Ozzie PHP
op 08-05-2014 12:19
gewijzigd op 08-05-2014 15:17
3.075 views
Ola peepz,
Puur uit nieuwsgierigheid... waar in een functie gooi jij je exception?
Vroeger deed ik dit:
<?php
public function foo() {
if (isset($this->bar)) {
return $this->bar;
}
throw Exception('bar not found');
}
?>
Ik koos voor deze aanpak omdat een "positief" if-statement sneller is dan een "negatief" if-statement. Ik deed het dus voor performance.
Tegenwoordig gebruik ik echter een "negatief" if-statement, en return ik de waarde pas aan het eind van de functie. Dan krijgen we dus dit:
<?php
public function foo() {
if (!isset($this->bar)) {
throw Exception('bar not found');
}
return $this->bar;
}
?>
Voor mijn gevoel is dit een logischere, duidelijkere opbouw van de functie.
Toch zag ik eerder deze week iemand op het forum de eerste versie gebruiken, en dus vroeg ik me af welke versie jullie gebruiken. De eerste of de laatste?
Dan had je het topic niet "waar foutafvanging" moeten noemen. Je wilt nu namelijk weten waar je de fout zou moeten gooien.
Precondities heb ik het liefst bovenaan. En op zo'n manier dat daar ook de foutmelding staat die bij de preconditie hoort. In dat geval dus bovenaan.
Postcondities zoals "deze methode mag nooit null returnen" komen dan waarschijnlijk wel weer onderaan.
Doe wat het meest leesbaar is. En aangezien smaken verschillen mag je zelf bepalen wat dat is. Zolang je maar argumenten kunt verzinnen en verdedigen.
Oh, en zoals bijna altijd: doe dit op een case by case basis.
package me.darsstar
import static java.util.Objects.requireNonNull;
...
public SomeObject someMethod(String miauw, int offset, int length) {
requireNonNull(miauw, "Violation of non-null contract for argument miauw");
if (offset < 0 || offset >= miauw.length()) {
throw new IllegalArgumentEception("Invalid offset");
}
if (length < 0 || length >= miauw.length() - offset) {
throw new IllegalArgumentEception("Invalid length");
}
SomeObject value;
...
value = injectedObject.someOtherMethod();
...
// dit hier
return requireNonNull(value, "Preventing violation of non-null contract for the return value");
}