Pergunta

Eu estou escrevendo uma .NET classe wrapper para uma classe nativa existente que lança exceções. Quais são as melhores práticas para a tradução entre exceções nativas C ++ e exceções gerenciados? Captura e re-lançamento em uma base one-to-one (por exemplo, std :: invalid_argument -> System.System.ArgumentException)? Existe um mapeamento já elaborado em algum lugar?

Foi útil?

Solução

Não há mapeamento padrão que eu saiba. O que eu fiz no passado é traduzir os que eu sei aproximadamente, e um bloco catch para System.Runtime.InteropServices.SEHException. Todas as exceções não traduzidos será transformado em que exceção. Enquanto você tem uma compilação de depuração do código que está jogando a exceção, você deve obter um bom rastreamento de pilha. Então você pode ir e olhar para a exceção e escrever o wrapper.

Mas no último projeto que eu tinha que fazer isso, eu fui com algo muito mais simples, acabei escrevendo um par de derivados System.Exception para logic_error e runtime_error. Então eu iria pegar essas 2 classes de base e uso typeid (err) para escrever a mensagem .NET que tenho jogado. Desta forma, eu não "perder" o que estava sendo jogado do C ++, mas não tem de mapear tudo, exceto os mais importantes.

Outras dicas

One-to-one mapeamento parece a abordagem mais sã para mim. "Universal" mapeamento é quase impossível por causa das exceções específicas do aplicativo, embora haja alguma mapeamento óbvia para classes de exceção STL.

Além disso, há uma questão de exceções SEH de código não gerenciado. Dependendo da situação, pode ser necessário para capturar e envolvê-los também.

Eu acho que depende do desenho da embalagem. Se a interface do invólucro gerente será quase idêntica à interface da biblioteca não gerenciada, então relançar as exceções 1: 1. Se você está mudando significativamente a interface, em seguida, lançar exceções mais apropriado para a nova interface. De qualquer forma, certifique-se o wrapper gera exceções qualquer momento uma operação não pode ser concluída para ser consistente com as diretrizes de design do .NET.

O que você está realmente tentando fazer?

Interop já traduz exceções nativas para gerenciado, incluindo exceções SEH. No entanto, as boas ditames de design que ALL excepções devem ser pego no nível API nativa. Você não deve desviar-se este a menos que haja uma boa razão. Nós não sabemos o suficiente sobre o seu design.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top