Witam!
Mogłby mi ktoś pomóc z tym zadaniem? W jaki sposób można tak powiem ponumerować te instrukcje albo schwytać?
https://ibb.co/XD5sL8d
Ponumerować? My nic nie numerujemy, to wyjatek ma zapisany stos wywołań wraz z numerami linii.
catch (Exception e) {
e.printStackTrace();
}
To mało estetyczne rozwiązanie, Jak przejrzysz dokumentację klasy Exception zobaczysz, że możesz uzyskać stos wywołań w postaci listy. W ogólnym przypadku chyba nie ma trywiialnego sposobu wybrać tylko te, które są w twoim kodzie. Jednak w tym wypadku znasz nazwę funkcji, która cię interesuję i generalnie stos wywołań zawsze będzie taki sam, więc jest o wiele łatwiej.
elwis napisał(a):
Ponumerować? My nic nie numerujemy, to wyjatek ma zapisany stos wywołań wraz z numerami linii.
catch (Exception e) { e.printStackTrace(); }
To mało estetyczne rozwiązanie, Jak przejrzysz dokumentację klasy Exception zobaczysz, że możesz uzyskać stos wywołań w postaci listy. W ogólnym przypadku chyba nie ma trywiialnego sposobu wybrać tylko te, które są w twoim kodzie. Jednak w tym wypadku znasz nazwę funkcji, która cię interesuję i generalnie stos wywołań zawsze będzie taki sam, więc jest o wiele łatwiej.
I niby prasowanie stackTrace'a w miałoby być bardziej "elastyczne"?
Gdybym ja pisał ten kod, to wolałbym wrzucić osobny wyjątek, np NumberedException
który miałby jakieś dane w sobie (np liczbę porządkową). Byłoby mniej magii.
Pierwszy wynik na google: e.getStackTrace()[1].getLineNumber();
. Odejmij od tego numer linijki, od której zaczyna się kod metody rzucającej wyjątkiem i będziesz miał które wywołanie rzuciło wyjątkiem. To skuteczne, ale bardzo brzydkie rozwiązanie, bo ekstremalnie podatne na edycję kodu (nowe linijki, zmiany nazw metod, wyjątek rzucany przez zagnieżdżoną metodę).
W praktyce tak się nie robi, bo:
- przede wszystkim niemal nigdy nie woła się tej samej metody kilka razy pod rząd, od tego są pętle;
- zwykle do namierzenia powodu błędu potrzebny jest cały stack trace, narzędzia do logowania to zapewniają;
- używa się gotowych bibliotek (np. log4j) rozwiązujących problem za programistę;
- nie połyka się wyjątku nie inforumując wywołującej metody, że coś wybuchło.
Zadanie czysto akademickie, nijk nie przystające do rzeczywistości.
Zadanie bez sensu, pewnie autor faktycznie chce żeby wyciągac coś z e.getStackTrace()[1].getLineNumber()
W praktyce pewnie zrobiłbyś jednak jakieś:
interface ThrowingFun{
public void call() throws Exception;
}
public void tryCall(ThrowingFun tf, String label){
try{
tf.call();
catch(Exception e){
log.error(label);
throw e;
}
}
i wołał te metody przez taką konstrukcje chociażby.