2010-07-25 13 views
6

Zawsze sprawdzam argumenty funkcji publicznych i zgłaszam wyjątki, gdy coś jest nie tak. (Dla prywatnych pomocników używam asercji).Automatyczny komunikat wyjątku IllegalArgumentException?

Jak to:

if(a < 0 || a >= b) 
    throw new IllegalArgumentException("'a' must be greater or equal to 0 and 
     smaller than b "); 

Ale to zawsze denerwuje mnie do napisania tych komunikatów o błędach. Komunikat wydaje się zbędny, ponieważ komunikat jest po prostu zaprzeczeniem oświadczenia:

Często zdarza się, że zmieniam nazwę zmiennej z refaktoryzacją (w środowisku Eclipse), a następnie komunikat nie odzwierciedla zmian. Albo zmieniam warunki i zapomnę zmienić wiadomości.

Byłoby wspaniale, gdybym mógł napisać coś takiego:

assertArgument(a >= 0 && a < b); 

ten powinien podnieść IllegalArgumentException z komunikatem jak

"violated argument assertion: a >= 0 && a < b." 

W C można napisać makro (faktycznie w C assert to tylko makro). Czy istnieje prosty sposób na zrobienie czegoś takiego w java?

Dziękujemy!

+0

Można wygenerować kod Java podczas kompilacji ... ale ból nie jest tego wart. Twój problem nie jest śmiertelny - tak długo, jak możesz określić linię, wszystko będzie dobrze. Można również napisać skrypt w języku Python, aby przejść przez kod i sprawdzić niespójności. –

+1

Co powiesz na tworzenie funkcji pomocnika 'checkParam (param, paramName)'? Następnie, nawet po zmianie nazwy zmiennych, możesz nadal wywoływać szybki skrypt w języku Python, aby wyszukać wszystkie wystąpienia checkParam i upewnić się, że są one koszerne. Być może ktoś inny może rozwinąć ten pomysł. –

+0

Można nawet użyć odbicia w trybie debugowania. –

Odpowiedz

3

W języku C nie można w tym celu użyć makr, ale w cpp (preprocesorze C) można :-) Jeśli naprawdę chcesz to zrobić, to nie ma nic, co ogranicza cię od uruchamiania cpp na twoim źródle java przed to się kompiluje. Pozwoliłoby to na użycie makr stylu cpp (może być konieczne usunięcie linii zaczynających się od #line z wyjścia cp).

W celu odtworzenia warunku w wyjątku, IMHO zawiera zbyt wiele szczegółów implementacji. Jeśli wiadomość o wyjątku opisuje naruszenie w umowie pod względem umowy (na przykład "nie podano obiektu nadrzędnego", "kwota nie może być ujemna"), nie trzeba jej zmieniać za każdym razem, gdy zmienia się stan.

+0

Masz rację co do preprocesora, ale uważam, że preprocesor C jest częścią programowania w języku C. Oświadczenia preprosesora mogą nie być częścią języka C, ponieważ kompilator języka C nigdy ich nie widzi, ale są one naprawdę niezbędne przy pisaniu programów w języku C. –

+0

Dziękuję za sugestie: użycie preprocesora lub uruchomienie skryptu (jak zasugerował Hamish Grubijan) w celu zmiany lub sprawdzenia kodu, może rozwiązać mój (naprawdę nie tak śmiertelny) problem. Mimo to myślałem o prostym i natywnym rozwiązaniu Java, ponieważ ważne jest również, aby inne osoby dokładnie rozumiały, co się dzieje.Potem znów mógłbym udostępnić tylko wygenerowany kod ... Czy może Design by Contract pomoże? Nie mam doświadczenia z DbC do tej pory. –

+0

Jeśli szukasz preprocesorów, możesz zajrzeć do M4 (http://www.gnu.org/software/m4/) DbC może Ci pomóc, ale normalnie nie uruchomisz oprzyrządowanego kodu w produkcji. Ponieważ twoje wymaganie jest jednym z skryptów perla lub Pythona, który naprawia twój argument wyjątku, prawdopodobnie jest to najszybsza droga. – rsp

Powiązane problemy