Есть ли в FCL уже исключение, означающее сбой выполнения метода?
Вопрос
У меня есть собственное исключение, которое выбрасывает сбой выполнения метода (p/invoke в моем случае).
public PInvokeException(string methodName)
: base(String.Format(CultureInfo.CurrentCulture,
"An error occured while external method '{0}' call",
methodName)) { }
Но я хочу заменить его на уже существующий.Есть ли в FCL что-то подобное?
Решение
Собирается ли ваш абонент выполнять различные действия в зависимости от того, генерируете ли вы исключение PInvokeException или InvalidOperationException? Если это так, то создайте пользовательское исключение PInvokeException. В противном случае используйте InvalidOperationException и очистите сообщение об ошибке.
См. Как создавать иерархии исключений . р>
Другие советы
В BCL нет ничего, предназначенного для вызовов PInvoke.Ближайшие из существующих — Marshal.GetExceptionForHR и Marshal.GetHRForLastWin32Error.Вы можете использовать комбинацию этих двух функций для создания соответствующего исключения при сбое вызова PInvoke.
Бывший:
throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
Существует один: Win32Exception а>. р>
Если метод, из которого вы вызываете исключение, - это метод .Net, который должен использовать пользовательское исключение (или существующее, в зависимости от того, что произошло). Если вы вызываете метод от имени человека, вызывающего ваш метод (или что-то связанное с отражением - но MethodInfo.Invoke делает это в любом случае), например: Вы должны использовать TargetInvocationException исключение. Если вы не можете обработать исключение, сбросьте его или проигнорируйте. public void DoIt(Action action) { action(); }
Как насчет System.Runtime.InteropServices.ExternalException
?