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

StackOverflow https://stackoverflow.com/questions/117940

Вопрос

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

Это было полезно?

Решение

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

Но в последнем проекте, в котором мне пришлось это делать, я выбрал что-то гораздо более простое, в итоге я написал пару Систем.Производные от исключений для logic_error и runtime_error.Затем я бы перехватил эти 2 базовых класса и использовал typeid (err) для записи .СЕТЕВОЕ сообщение, которое было выброшено.Таким образом, я не "потерял" то, что было выброшено из C ++, но мне не нужно было сопоставлять все, кроме самых важных.

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top