obsługa wyjątków

0

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

1

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.

0
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.

2

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.

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1