przede wszystkim:
Nie chcesz tego robić.
Wyjątki nie są przeznaczone do obsługi błędów, ale powodują błędy w czasie wykonywania, które uniemożliwiają spełnienie przez funkcję warunków innych funkcji, do których ma zadzwonić, lub dotrzymania obietnicy spełnienia własnych post-warunki (biorąc pod uwagę, że osoba dzwoniąca spełniła warunki wstępne). Zobacz na przykład: this article by Herb Sutter.
Nie kiedykolwiek napisać coś takiego:
try
{
//bug condition <== NO! Exceptions are not meant to handle bugs
}
catch()
{
//Remove file
}
ale raczej:
assert(/* bug condition... */);
wracając do pytania:
Program jest zachowanie niezdefiniowane i najprawdopodobniej nie spowoduje żadnego wyjątku, gdy wykonasz:
char TempArray[10];
char c = TempArray[11];
Łapanie wszystkich wyjątków nie pomoże. Jest to błąd, tj. Błąd programowania programowanie i należy się upewnić, czy powinieneś obsługiwać błędy w sposób, który przenosi kontrolę do rutynowych procedur; co więcej, jeśli przyznajesz obecność błędów w swoim programie, czy nie mógłbyś po prostu przekazać kontroli do obsługi błędu? To może jeszcze bardziej pogorszyć sytuację.
Błędy powinny być rozwiązywane przez , zapobiegając im, korzystając z twierdzeń, być może stosując metodologie takie jak rozwój sterowany testami i tak dalej.
To powiedział, jeśli chodzi o sposób, aby złapać wszystkie wyjątki, można zrobić:
try
{
// ...
}
catch (...) // <== THIS WILL CATCH ANY EXCEPTION
{
}
Ale używając catch (...)
jest zalecane jako wytyczne projektowania, ponieważ łatwo prowadzi do przełknięcia warunki błędach, które mają być obsługiwane i zapomnij o nich. W końcu wymyślono wyjątki, aby uniemożliwić programistom zapominanie o sprawdzaniu kodów błędów, a catch (...)
czyni to tak łatwym.
Dla celów catch-wszystko, to byłoby lepiej niech wszystkich wyjątków pochodzą z std::exception
, a następnie wykonaj:
try
{
// ...
}
catch (std::exception& e)
{
// Do something with e...
}
'catch (...)' zrobi to, co chcesz. – Rapptz
Łapiesz wyjątki, nie asercje. A catch-all catch to "catch (...)". – juanchopanza
Twój przykładowy błąd wywołuje niezdefiniowane zachowanie i prawdopodobnie nie spowoduje wyjątku i nie zostanie przechwycony. – interjay