A maneira convencional de lançar e capturar exceções é lançar um objeto de exceção e capturá-lo por referência (geralmente constreferência). A linguagem C ++ requer que o compilador gere o código apropriado para construir o objeto de exceção e para limpá-lo adequadamente no momento apropriado.
Lançar um ponteiro para um objeto alocado dinamicamente nunca é uma boa idéia. As exceções devem permitir que você escreva um código mais robusto em face das condições de erro. Se você lançar um objeto de exceção da maneira convencional, pode ter certeza de que, se ele for capturado por uma cláusula catch que nomeia o tipo correto, por um catch (...), se for lançado novamente ou não, será destruído corretamente no momento apropriado. (A única exceção é se ele nunca for detectado, mas esta é uma situação irrecuperável de qualquer maneira que você olhe para ela.)
Se você lançar um ponteiro para um objeto alocado dinamicamente, terá que ter certeza de que, seja qual for a aparência da pilha de chamadas no ponto em que deseja lançar sua exceção, há um bloco catch que nomeia o tipo de ponteiro correto e tem a deletechamada apropriada . Sua exceção nunca deve ser capturada por, a catch (...)menos que esse bloco lance novamente a exceção que é então capturada por outro bloco catch que lida corretamente com a exceção.
Efetivamente, isso significa que você pegou o recurso de tratamento de exceções que deve tornar mais fácil escrever código robusto e dificultar a escrita de código correto em todas as situações. Isso é deixar de lado o problema de que será quase impossível agir como código de biblioteca para código cliente que não esteja esperando esse recurso.
throw gcnewque seria útil, por exemplo. se você deseja que o código gerenciado capture sua exceção. Alguém pode me corrigir sobre isso?