Przez większość czasu będę używał wyjątku, aby sprawdzić warunek w moim kodzie, zastanawiam się, kiedy jest odpowiedni moment na użycie asercji?
Na przykład,
Group group=null;
try{
group = service().getGroup("abc");
}catch(Exception e){
//I dont log error because I know whenever error occur mean group not found
}
if(group !=null)
{
//do something
}
Czy możesz wskazać, jak pasuje tutaj stwierdzenie? Czy powinienem użyć asercji?
Wygląda na to, że nigdy nie używam asercji w kodzie produkcyjnym i widzę tylko asercje w testach jednostkowych. Wiem, że w większości przypadków mogę po prostu użyć wyjątku, aby sprawdzić jak powyżej, ale chcę wiedzieć, jak to zrobić „profesjonalnie”.
Nie myślę (lista może być niepełna i zbyt długa, aby zmieścić się w komentarzu), powiedziałbym:
Innymi słowy, wyjątki dotyczą niezawodności aplikacji, podczas gdy potwierdzenia dotyczą jej poprawności.
Asercje są zaprojektowane tak, aby były tanie w pisaniu, możesz ich używać prawie wszędzie i używam tej praktycznej zasady: im bardziej stwierdzenie asercji wygląda głupio, tym jest cenniejsze i tym więcej informacji zawiera. Podczas debugowania programu, który nie zachowuje się we właściwy sposób, z pewnością sprawdzisz bardziej oczywiste możliwości niepowodzenia w oparciu o swoje doświadczenie. Następnie sprawdzisz problemy, które po prostu nie mogą się zdarzyć: właśnie wtedy asercje bardzo pomagają i oszczędzają czas.
źródło
Pamiętaj, że asercje można wyłączyć w czasie wykonywania za pomocą parametrów i są one domyślnie wyłączone , więc nie licz na nie z wyjątkiem debugowania.
Powinieneś także przeczytać artykuł Oracle o asercji, aby zobaczyć więcej przypadków, w których należy używać - lub nie używać - asercji.
źródło
Z reguły:
java
polecenie domyślnie wyłącza wszystkie potwierdzenia).Poniższy kod z twojego pytania jest w złym stylu i może zawierać błędy
Problem w tym, że NIE WIESZ, że wyjątek oznacza, że grupa nie została znaleziona. Możliwe jest również, że
service()
wywołanie zgłosiło wyjątek lub wróciło,null
co spowodowało błądNullPointerException
.Kiedy wychwytujesz „oczekiwany” wyjątek, powinieneś wychwycić tylko ten wyjątek, którego oczekujesz. Wyłapując
java.lang.Exception
(a zwłaszcza nie rejestrując go), utrudniasz zdiagnozowanie / debugowanie problemu i potencjalnie pozwalasz aplikacji wyrządzić więcej szkód.źródło
Cóż, w firmie Microsoft zalecono, aby wyrzucić wyjątki we wszystkich interfejsach API, które udostępniasz publicznie, i używać potwierdzeń do wszelkiego rodzaju założeń dotyczących kodu, który jest wewnętrzny. To trochę luźna definicja, ale myślę, że wyznaczenie granicy zależy od każdego programisty.
Jeśli chodzi o użycie wyjątków, jak sama nazwa wskazuje, ich użycie powinno być wyjątkowe, więc dla kodu, który przedstawisz powyżej,
getGroup
połączenie powinno powrócić,null
jeśli nie istnieje żadna usługa. Wyjątek powinien wystąpić tylko wtedy, gdy łącze sieciowe zepsuje się lub coś w tym stylu.Wydaje mi się, że wniosek jest taki, że definiowanie granic asercji i wyjątków pozostawiono zespołowi programistów w przypadku każdej aplikacji.
źródło
Zgodnie z tym dokumentem http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#design-faq-general „Oświadczenie asertu jest odpowiednie dla niepublicznego warunku wstępnego, warunku końcowego i niezmiennej klasy sprawdzanie. Publiczne sprawdzanie warunków wstępnych powinno nadal być przeprowadzane poprzez sprawdzanie wewnątrz metod, które skutkują w szczególności udokumentowanymi wyjątkami, takimi jak IllegalArgumentException i IllegalStateException. "
Jeśli chcesz dowiedzieć się więcej o warunku wstępnym, warunku końcowym i niezmienności klas, zajrzyj do tego dokumentu: http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#usage-conditions . Zawiera również przykłady użycia asercji.
źródło
Testowanie pod kątem wartości null wyłapie tylko wartości null powodujące problemy, podczas gdy próba / catch, jaką masz, wykryje każdy błąd.
Ogólnie rzecz biorąc, try / catch jest bezpieczniejsze, ale nieco wolniejsze, i musisz uważać, aby wyłapać wszystkie rodzaje błędów, które mogą wystąpić. Więc powiedziałbym, że użyj try / catch - pewnego dnia kod getGroup może się zmienić i po prostu możesz potrzebować tej większej sieci.
źródło
Możesz korzystać z tej prostej różnicy podczas ich użytkowania. Wyjątki będą używane do sprawdzania oczekiwanych i nieoczekiwanych błędów zwanych błędami sprawdzonymi i niesprawdzonymi, podczas gdy asercja jest używana głównie do debugowania w czasie wykonywania, aby sprawdzić, czy założenia są sprawdzone, czy nie.
źródło
Wyznaję, że twoje pytanie trochę mnie zdezorientowało. Gdy warunek potwierdzenia nie zostanie spełniony, zostanie zgłoszony wyjątek. Myląco nazywa się to AssertionError . Zauważ, że nie jest zaznaczone, jak (na przykład) IllegalArgumentException, który jest generowany w bardzo podobnych okolicznościach.
Więc używając asercji w Javie
źródło
Zobacz sekcję 6.1.2 (Potwierdzenia a inne kody błędów) dokumentacji firmy Sun pod następującym łączem.
http://www.oracle.com/technetwork/articles/javase/javapch06.pdf
Ten dokument zawiera najlepsze porady, jakie widziałem, kiedy używać asercji. Cytat z dokumentu:
„Dobrą praktyczną zasadą jest to, że w wyjątkowych przypadkach powinieneś używać asercji, o których chciałbyś zapomnieć. Asercja to najszybszy sposób radzenia sobie z warunkiem lub stanem, o którym nie spodziewasz się, i zapomnienia o nim radzić sobie z."
źródło
Niestety potwierdzenia mogą zostać wyłączone. Podczas produkcji potrzebujesz wszelkiej pomocy, jaką możesz uzyskać, tropiąc coś nieprzewidzianego, więc twierdzą, że dyskwalifikują się.
źródło