Sprawdzone wyjątki są przeznaczone do stosowania w sytuacjach, w których metoda może oczekiwać, że jej rozmówca będzie przygotowany na rozwiązanie pewnych problemów, które mogą się pojawić. Jeśli osoby dzwoniące pod numerami BaseFoo.Bar()
nie są wymagane do obsługi numeru FnordException
, to metoda DerivedFoo.Bar()
nie może oczekiwać, że jego rozmówcy będą mieli do czynienia z FnordException
(ponieważ wielu z nich będzie takich samych, którzy nie byli przygotowani, aby go wyrzucić).
Pojęciowo, to świetnie. W praktyce nie tak bardzo. Problem polega na tym, że projekt sprawdzonych wyjątków w języku zakłada, że żaden z dzwoniących nie będzie przygotowany na radzenie sobie z konkretnym problemem, albo wszyscy rozmówcy będą przygotowani na to. Normalnym stanem rzeczy w praktyce jest, aby rozmówcy byli nieprzygotowani do radzenia sobie z wyjątkami - nawet tymi, z którymi niektórzy rozmówcy mogliby sobie poradzić. Przez większość czasu prawidłowym działaniem, gdy kod otrzymuje sprawdzony wyjątek, którego nie oczekuje się, byłoby zapakowanie go w niesprawdzony wyjątek i wyrzucenie go. Jak na ironię, najłatwiejszy sposób działania - dodanie klauzuli "throws" i zezwolenie na sprawdzanie wyjątkowego bańki, jest prawdopodobnie najmniej prawdopodobne. Chociaż istnieje kilka przypadków (np. IOException
), gdzie takie zachowanie miałoby sens (np. Podczas próby odczytania kolekcji z pliku, błąd wejścia/wyjścia podczas odczytu jednego elementu jest błędem wejścia/wyjścia podczas odczytu kolekcji), wyjątek wyrzucony z zagnieżdżonego wywołania metody będzie reprezentował inny warunek, niż wyjątek tego samego typu rzucany przez zewnętrzną metodę, a kod, który byłby przygotowany do obsługi tego ostatniego, może nie być przygotowany do obsługi tego pierwszego.
W Twojej sytuacji najlepiej jest złapać IOException
i zawinąć go w inny typ, który pochodzi od RuntimeException
, mając świadomość, że twoi rozmówcy raczej nie będą w stanie sobie z tym poradzić.
Pokaż nam pełny kod demonstrujący problem. W tym również w pełni kwalifikowana nazwa klasy dla 'wyjątków'. –
możesz pokazać nieco więcej swojego kodu i dokładny błąd, który otrzymujesz? – aniri
Mój działa. Powinieneś pokazać nam więcej kodu. – Averroes