2008-09-22 3 views
4

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

ответ

4

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

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

2

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

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

2

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

1

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

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

Смежные вопросы