Лучшие практики для перевода исключений в класс-оболочку C ++ / CLI - PullRequest
4 голосов
/ 23 сентября 2008

Я пишу класс-оболочку .NET для существующего нативного класса, который генерирует исключения. Каковы лучшие практики для перевода между собственными исключениями C ++ и управляемыми исключениями? Поймать и перебросить один на один (например, std :: invalid_argument -> System.System.ArgumentException)? Где-то уже составлено отображение?

Ответы [ 4 ]

4 голосов
/ 23 сентября 2008

Нет стандартного отображения, о котором я знаю. В прошлом я перевел те, о которых я знаю, и блок перехвата для System.Runtime.InteropServices.SEHException. Все непереведенные исключения будут превращены в это исключение. Пока у вас есть отладочная сборка кода, который выдает исключение, вы должны получить хорошую трассировку стека. Тогда вы можете пойти и посмотреть на исключение и написать оболочку.

Но в последнем проекте, который мне приходилось делать, я решил кое-что гораздо более простое, в итоге я написал пару производных System.Exception для logic_error и runtime_error. Затем я бы поймал эти 2 базовых класса и использовал typeid (err), чтобы написать полученное сообщение .NET. Таким образом, я не «потерял» то, что выкинуло из C ++, но мне не пришлось отображать все, кроме самых важных.

2 голосов
/ 23 сентября 2008

Я думаю, это зависит от дизайна обертки. Если интерфейс оболочки менеджера будет практически идентичен интерфейсу неуправляемой библиотеки, то отбросьте исключения 1: 1. Если вы значительно меняете интерфейс, генерируйте исключения, наиболее подходящие для нового интерфейса. В любом случае, убедитесь, что оболочка генерирует исключения каждый раз, когда невозможно выполнить операцию, чтобы соответствовать рекомендациям по дизайну .NET.

2 голосов
/ 23 сентября 2008

Картографирование один на один кажется мне самым разумным подходом. «Универсальное» сопоставление вряд ли возможно из-за специфических для приложения исключений, хотя для классов исключений STL существует некоторое очевидное сопоставление.

Также существует проблема исключений SEH из неуправляемого кода. В зависимости от вашей ситуации может возникнуть необходимость поймать и обернуть их.

1 голос
/ 01 октября 2008

Что вы на самом деле пытаетесь сделать?

Interop уже переводит собственные исключения в управляемые, включая исключения SEH. Тем не менее, хороший дизайн требует, чтобы ALL исключения были перехвачены на уровне API Вы не должны отклоняться от этого, если нет веской причины. Мы недостаточно знаем о вашем дизайне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...