Konwencjonalnym sposobem zgłaszania i przechwytywania wyjątków jest zgłoszenie obiektu wyjątku i przechwycenie go przez odwołanie (zwykle const
odwołanie). Język C ++ wymaga, aby kompilator wygenerował odpowiedni kod, aby skonstruować obiekt wyjątku i odpowiednio go wyczyścić w odpowiednim czasie.
Rzucanie wskaźnika do dynamicznie przydzielanego obiektu nigdy nie jest dobrym pomysłem. Wyjątki mają umożliwić pisanie bardziej niezawodnego kodu w obliczu błędów. Jeśli wyrzucisz obiekt wyjątku w konwencjonalny sposób, możesz być pewien, że niezależnie od tego, czy zostanie przechwycony przez klauzulę catch z nazwą poprawnego typu, przez a catch (...)
, czy zostanie następnie ponownie wyrzucony, czy nie, zostanie poprawnie zniszczony w odpowiednim czasie. (Jedynym wyjątkiem jest sytuacja, w której nigdy nie zostanie złapany, ale jest to sytuacja niemożliwa do odzyskania, niezależnie od tego, jak na to spojrzysz).
Jeśli rzucasz wskaźnik do dynamicznie przydzielanego obiektu, musisz być pewien, że niezależnie od tego, jak wygląda stos wywołań w miejscu, w którym chcesz zgłosić wyjątek, istnieje blok catch, który nazywa właściwy typ wskaźnika i ma odpowiednie delete
wywołanie. Twój wyjątek nigdy nie może zostać przechwycony, catch (...)
chyba że ten blok ponownie wyrzuci wyjątek, który jest następnie przechwytywany przez inny blok catch, który poprawnie radzi sobie z wyjątkiem.
W rzeczywistości oznacza to, że skorzystałeś z funkcji obsługi wyjątków, która powinna ułatwić pisanie solidnego kodu i bardzo utrudniłaby pisanie kodu, który byłby poprawny we wszystkich sytuacjach. Pomija to problem, że prawie niemożliwe będzie działanie jako kod biblioteki dla kodu klienta, który nie będzie oczekiwał tej funkcji.
throw gcnew
przydałoby się np. jeśli chcesz, aby kod zarządzany przechwytywał Twój wyjątek. Czy ktoś może mnie w tym poprawić?