У FCL уже есть исключение, означающее сбой выполнения метода? - PullRequest
0 голосов
/ 06 марта 2009

У меня есть собственное исключение, которое выдает сбой выполнения метода (p / invoke в моем случае).

public PInvokeException(string methodName)
: base(String.Format(CultureInfo.CurrentCulture,
"An error occured while external method '{0}' call",
methodName)) { }

Но я хочу заменить его уже существующим. Есть ли в FCL что-то подобное?

Ответы [ 4 ]

2 голосов
/ 13 марта 2009

Собирается ли ваш абонент совершать различные действия в зависимости от того, генерируете ли вы исключение PInvokeException и InvalidOperationException? Если это так, то создайте пользовательское исключение PInvokeException. В противном случае используйте InvalidOperationException и очистите сообщение об ошибке.

См. Как проектировать иерархии исключений .

1 голос
/ 13 марта 2009

Как насчет System.Runtime.InteropServices.ExternalException?

1 голос
/ 09 марта 2009

Есть одно: Win32Exception .

Если метод, из которого вы вызываете исключение, является .Net-методом, то вы должны использовать пользовательское исключение (или существующее, в зависимости от того, что произошло).

Если вы вызываете метод от имени человека, вызывающего ваш метод (или что-то связанное с отражением - но MethodInfo.Invoke делает это в любом случае), например:

public void DoIt(Action action) { action(); }

Вы должны использовать исключение TargetInvocationException .

Если вы не можете обработать исключение, сбросьте его или проигнорируйте.

1 голос
/ 06 марта 2009

Нет ничего, что посвящено вызовам PInvoke в BCL. Наиболее близкими из существующих являются Marshal.GetExceptionForHR и Marshal.GetHRForLastWin32Error. Вы можете использовать комбинацию этих двух функций, чтобы генерировать соответствующее исключение при сбое вызова PInvoke.

Ex:

throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
...