tak to się chyba nazywa?
Nie - nie ma takiego pojęcia jak zagnieżdżona metoda
.
W sumie to raczej nikt nie wymyślił specjalnego określenia na taki ciąg wywołania, opis słowny wystarczy.
W takim razie czy należy wyrzucać ten wyjątek po kolei do metod wyżej przy użyciu throw?
Nie - wyjątek zostanie automatycznie przejęty przez najbliższy blok try..catch
, niezależnie, jak "daleko" czy głęboko nastąpi rzucenie błędu.
Oczywiście poza przypadkiem, gdy takiego bloku per se nie będzie.
Czy komunikat wyświetlać w tej metodzie, w której wyrzucany jest wyjątek
Nie - to się po prostu nie opłaca, bo w n
metodach musiałbyś mieć n
niemalże identycznych odwołań do GUI. W razie gdyby nastąpiła chęć zmiany sposobu wyświetlania komunikatu - musiałbyś to zrobić w n
metodach, zamiast po prostu w jednym miejscu.
Zresztą zobacz sam:
using System;
public class Test {
public static void Main() {
try {
FirstMethod();
SecondMethod(true);
ThirdMethod();
} catch (Exception ex) {
Console.WriteLine("Wystapil bardzo krytyczny blad: " + ex.Message);
}
}
public static void FirstMethod() {
throw new Exception("FirstMethod() internal error");
}
public static void SecondMethod(bool pony) {
if (pony) {
throw new Exception("SecondMethod() internal error, case 1");
} else {
throw new Exception("SecondMethod() internal error, case 2");
}
}
public static void ThirdMethod() {
int x = 0;
for (int i = 0; i < 10; i++) {
x += i & 1;
}
if (x%2 == 0) {
throw new Exception("ThirdMethod() internal error");
}
}
}
Oraz:
using System;
public class Test {
public static void Main() {
try {
FirstMethod();
SecondMethod(true);
ThirdMethod();
} catch (Exception ex) {
}
}
public static void FirstMethod() {
Console.WriteLine("Wystapil bardzo krytyczny blad: FirstMethod() internal error");
throw new Exception();
}
public static void SecondMethod(bool pony) {
if (pony) {
Console.WriteLine("Wystapil bardzo krytyczny blad: SecondMethod() internal error, case 1");
throw new Exception();
} else {
Console.WriteLine("Wystapil bardzo krytyczny blad: SecondMethod() internal error, case 2");
throw new Exception();
}
}
public static void ThirdMethod() {
int x = 0;
for (int i = 0; i < 10; i++) {
x += i & 1;
}
if (x%2 == 0) {
Console.WriteLine("Wystapil bardzo krytyczny blad: ThirdMethod() internal error");
throw new Exception();
}
}
}
A teraz powiedzmy, że chcesz zmienić treść komunikatu błędu - ile razy dłużej zajmie Ci zmiana w wersji drugiej?
Wydaje mi się że pierwszy sposób jest bardziej sensowny, ale słabo czuję temat
Kurczę - na logikę: co jest bardziej sensownego
w robieniu kopiuj-wklej tego samego kodu do wyświetlania wiadomości użytkownikowi i rzucania wyjątku tak czy siak (bo inaczej nie przerwiesz wykonywania kodu), zamiast rzucenia wyjątku i obsługi go w innym, przeznaczonym do tego celu miejscu aplikacji?
Powiedz mi proszę, bo jestem ciekaw, jakie miałbyś argumenty za tym (ponieważ zakładam, że nie rzuciłeś sobie hasełka od tak, tylko jakiś proces myślowy przed napisaniem posta przeprowadziłeś i jestem ciekaw jego rezultatów).