В коде C# вы можете поймать естественное исключение, выброшенное из глубины некоторой неуправляемой библиотеки? Если это так, вам нужно сделать что-то по-другому, чтобы поймать его или сделать стандартную попытку ... поймать его?Можете ли вы поймать собственное исключение в коде C#?
ответ
Вы можете использовать Win32Exception и использовать его Свойство NativeErrorCode для правильной обработки.
// http://support.microsoft.com/kb/186550
const int ERROR_FILE_NOT_FOUND = 2;
const int ERROR_ACCESS_DENIED = 5;
const int ERROR_NO_APP_ASSOCIATED = 1155;
void OpenFile(string filePath)
{
Process process = new Process();
try
{
// Calls native application registered for the file type
// This may throw native exception
process.StartInfo.FileName = filePath;
process.StartInfo.Verb = "Open";
process.StartInfo.CreateNoWindow = true;
process.Start();
}
catch (Win32Exception e)
{
if (e.NativeErrorCode == ERROR_FILE_NOT_FOUND ||
e.NativeErrorCode == ERROR_ACCESS_DENIED ||
e.NativeErrorCode == ERROR_NO_APP_ASSOCIATED)
{
MessageBox.Show(this, e.Message, "Error",
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
}
}
Если вы используете
try
{
}
catch(Exception ex)
{
}
будет перехватывать все исключения, в зависимости от того, как вы называете внешние библиотеки, вы можете получить связанное исключение ком, который инкапсулирует ошибку, но он будет ловить ошибку.
Уровень взаимодействия между C# и собственным кодом преобразует исключение в управляемую форму, позволяя ему быть пойманным вашим кодом C#. Начиная с .NET 2.0, catch (Exception)
должен поймать что-либо, кроме невосстановимой ошибки.
Стандартная попытка улова должна делать трюк, на который я верю.
бегает с аналогичной проблемой с System.Data исключением метания исключения SQLClient, который был неперехваченным, добавив try..catch в мой код сделал трюк в экземпляре
Где-то с помощью .NET Reflector я видел следующий код:
try {
...
} catch(Exception e) {
...
} catch {
...
}
Хм, C# не позволяет бросить исключение не вытекающее из класса System.Exception. И насколько я знаю какое-либо исключение, cautch by interch marshaller завершается классом исключения, который наследует System.Exception.
Так что мой вопрос в том, можно ли поймать исключение, которое не является исключением System.Exception.
Поймать без() будет перехватывать исключения, отличные от CLS, включая собственные исключения.
try
{
}
catch
{
}
Смотрите правила FxCop для получения дополнительной информации http://msdn.microsoft.com/en-gb/bb264489.aspx
Это зависит от того, какого типа родного исключения вы говорите. Если вы ссылаетесь на исключение SEH, CLR будет делать одну из двух вещей.
- В случае известного кода ошибки SEH он сопоставляет его к соответствующему .Net исключения (т.е. OutOfMemoryException)
- В случае маркированного назначаемыми (E_FAIL) или неизвестный код будет просто выбросить пример SEHException.
Оба они будут пойманы с помощью простого блока «catch (Exception)».
Другой тип естественного исключения, который может пересекать нативную/управляемую границу, - это исключения C++. Я не уверен, как они отображаются/обрабатываются. Я предполагаю, что, поскольку Windows реализует исключения C++ поверх SEH, они просто отображаются одинаково.
Почти, но не совсем.Вы поймаете исключение с
try
{
...
}
catch (Exception e)
{
...
}
, но у вас все еще будут проблемы. Согласно MSDN для того, чтобы обеспечить исключения деструкторов называются вы должны поймать как:
try
{
...
}
catch
{
...
}
Это единственный способ застраховать деструктор исключение называется (хотя я не знаю, почему). Но это оставляет вам компромисс между грубой силой и возможной утечкой памяти.
Кстати, если вы используете подход (Exception e), вы должны знать различные типы исключений, которые могут возникнуть. RuntimeWrappedException - это то, к чему будет управляться любой управляемый тип без исключения (для языков, которые могут вызывать строку), а другие будут отображаться, например OutOfMemoryException и AccessViolationException. COM Interop HRESULTS или исключения, отличные от E___FAIL, будут отображаться в COMException, и, наконец, в конце вы получите SEHException для E_FAIL или любое другое неотображенное исключение.
Так что вы должны делать? Лучший выбор - это не исключать исключения из вашего неуправляемого кода! Хах. На самом деле, хотя, если у вас есть выбор, возникают барьеры и неудачи, которые делают выбор, который хуже, вероятность утечки памяти во время обработки исключений или не зная, какой тип является вашим исключением.
- 1. Можете ли вы поймать исключение изнутри Application.DoEvents()?
- 2. Python поймать собственное исключение
- 3. Не удается поймать собственное исключение в управляемом коде
- 4. Можете ли вы поймать исключение по типу оператора преобразования?
- 5. Можете ли вы поймать в использовании блок?
- 6. C# Вы можете изучить исключение, не поймав?
- 7. Создайте собственное исключение, используя C#
- 8. Можете ли вы написать значение строки непосредственно в коде C#
- 9. Почему вы можете выбросить исключение, но не поймать его?
- 10. Можете ли вы настроить собственное свойство зависимостей в Silverlight?
- 11. Можете ли вы догадаться, откуда это исключение?
- 12. Можете ли вы запретить iPhone использовать собственное меню выбора?
- 13. Можете ли вы объяснить, что происходит в этом коде Ruby?
- 14. Как вы можете поймать событие contentEditable paste?
- 15. C# как поймать Исключение
- 16. Можете ли вы использовать C++ DLL в коде C# в UWP?
- 17. C++ как поймать исключение?
- 18. Можете ли вы добавить атрибуты в GridView в коде?
- 19. Можете ли вы поймать «вновь связанное» событие с Монго Касбахом?
- 20. Можете ли вы использовать C++ в Xcode?
- 21. Можете ли вы скрыть файлы в c?
- 22. Можете ли вы #define комментарий в C?
- 23. Можете ли вы наследовать динамику в C#?
- 24. C++ попробовать/поймать не поймать исключение
- 25. Можете ли вы сделать NetTcpBinding в коде? Тебе следует?
- 26. Можете ли вы масштабировать ImageView в коде? Android
- 27. Можете ли вы объяснить использование sys.sp_addextendedproperty в следующем коде?
- 28. Можете ли вы определить логическую ошибку в этом коде? Counts
- 29. Можете ли вы показать примеры SQL Injection в этом коде?
- 30. Можете ли вы решить это в кратком коде?
Вы не можете поймать StackOverflow или OutOfMemoryException, хотя, несмотря ни на что, правильно? – core 2008-09-30 05:14:16
те заканчивают ошибки, которые останавливают приложение, поэтому да, вы не можете работать с ними. – 2008-09-30 13:58:50
На самом деле это не совсем правильно, это приведет к сбоям всех исключений, связанных с CLS. C++/CLI и MC++ - это языки, способные бросать исключения, не связанные с CLS. – 2011-03-25 16:47:32