Я пишу класс оболочки .NET для существующего класса, который генерирует исключения. Каковы наилучшие методы перевода между исходными исключениями C++ и управляемыми исключениями? Поймать и повторно бросить по принципу «один к одному» (например, std :: invalid_argument -> System.System.ArgumentException)? Есть ли какое-то картографирование?Лучшая практика для перевода исключений из класса оболочки C++/CLI
ответ
Нет стандартного сопоставления, о котором я знаю. То, что я делал в прошлом, это перевести те, о которых я знаю, и блок catch для System.Runtime.InteropServices.SEHException. Все непереведенные исключения будут превращены в это исключение. Пока у вас есть отладочная сборка кода, который бросает исключение, вы должны получить красивую трассировку стека. Затем вы можете пойти и посмотреть на исключение и написать обертку.
Но в последнем проекте я должен был это сделать, я пошел с чем-то намного более простым, я закончил тем, что написал пару производных от System.Exception для logic_error и runtime_error. Затем я бы поймал эти 2 базовые классы и использовал typeid (err), чтобы написать сообщение .NET, которое было выброшено. Таким образом, я не «потерял» то, что было выброшено с C++, но не нужно было отображать все, кроме самых важных.
Индивидуальное отображение кажется мне самым подходящим. «Универсальное» сопоставление вряд ли возможно из-за специфических для приложения исключений, хотя существует некоторое очевидное сопоставление для классов исключений STL.
Также существует проблема исключений SEH из неуправляемого кода. В зависимости от вашей ситуации, возможно, придется поймать и обернуть их тоже.
Я думаю, что это зависит от дизайна обертки. Если интерфейс обертки менеджера будет почти идентичен интерфейсу неуправляемой библиотеки, повторите сброс 1: 1. Если вы значительно меняете интерфейс, то бросайте исключения, наиболее подходящие для нового интерфейса. В любом случае, убедитесь, что обертка генерирует исключения в любой момент, когда операция не может быть выполнена, чтобы соответствовать принципам разработки .NET.
Что вы действительно пытаетесь сделать?
Interop уже переводит родные исключения в управляемые, включая исключения SEH. Тем не менее, хороший дизайн диктует, что исключения ALL должны быть обнаружены на собственном уровне API. Вы не должны отклоняться от этого, если нет веской причины. Мы не знаем достаточно о вашем дизайне.
- 1. Лучшая практика для обработки исключений
- 2. Лучшая практика для перевода строчных кодированных строк
- 3. Лучшая практика обработки исключений Java
- 4. Лучшая практика в OData для исключений
- 5. Лучшая практика для исключенных исключений не используется
- 6. Лучшая практика для написания особых исключений
- 7. Лучшая практика: Обнаружение электронной оболочки
- 8. Лучшая практика для рекурсивного класса
- 9. Лучшая практика JavaScript-класса?
- 10. Лучшая практика для параметров ввода оболочки?
- 11. Лучшая практика перевода CakePHP 3.x __ Функция
- 12. Проверка исключений в DTO - лучшая практика
- 13. Лучшая практика обработки исключений в асинхронном вызове
- 14. Лучшая практика использования обработки исключений PHP
- 15. Лучшая практика для исключения исключений в классе утилиты
- 16. Лучшая практика для перевода результата Linq в словарь
- 17. Rails: Лучшая практика для местоположений класса модели?
- 18. Лучшая практика для поддержания класс (-ов) класса
- 19. Лучшая практика: ошибка класса handle
- 20. Лучшая практика для Getters
- 21. Лучшая практика для этого подхода к обработке исключений node.js?
- 22. Лучшая практика обработки ошибок и исключений для C# API
- 23. Лучшая практика для шаблона DAO?
- 24. Лучшая практика для сериализации XML-документа из класса
- 25. Лучшая практика для методов async/await и обработки исключений
- 26. Лучшая практика для обработки исключений при использовании Q.promise
- 27. Лучшая практика для печенья
- 28. Лучшая практика для webservices
- 29. Лучшая практика для NSNotifications
- 30. Лучшая практика для тестирования. Архитектура