#c# #.net #winforms #exception
#c# #.net #winforms #исключение
Вопрос:
Ну, может быть, странный вопрос, но как бы я обрабатывал необработанные исключения только из определенных сборок в приложении, но включая исключения, которые происходят из .Сама СЕТЬ, например, когда вы получаете ADO.NET исключение, из которого оно происходит.ЧИСТАЯ сборка.
Мне это нужно из-за работы с устаревшим приложением, где мне нужна необработанная обработка исключений только для модуля, состоящего из нескольких сборок, и в конечном итоге все находится в одном приложении как часть одного процесса.
Могу ли я, возможно, перехватывать исключения на уровне сборки, а не на глобальном уровне приложений?
Комментарии:
1. Деннис, просто из любопытства: был ли какой-либо из приведенных ниже ответов полезен для вас, вы все еще ждете серебряной пули?
Ответ №1:
Просто проверьте трассировку стека и используйте throw;
, если вам не следует обрабатывать исключение.
try
{
//something
}
catch (Exception err)
{
if (!err.StackTrace.Contains("YourAssemblyName"))
throw;
}
Комментарии:
1. да, я тоже думал об этом, но stacktrace также содержит имена папок, и что, если какая-то папка называется так же, как и сборка
2. Включите пробел типа
" YourAssemblyName"
.3. Извините, но не могли бы вы объяснить, как пространство поможет в этом случае?
4. Поскольку папка не будет начинаться с пробела, а все элементы трассировки стека начинаются с «at assembly.namespace», но «at» может меняться для разных языков ОС
Ответ №2:
Нет, но вы можете перехватывать на уровне AppDomain. Если изменение уместно в вашем приложении, попробуйте :
-
Создайте новый AppDomain
-
Перехватывать необработанные исключения домена
Редактировать :
AppDomain otherAppDomain = AppDomain.CreateDomain("myDomain");
otherAppDomain.UnhandledException = new UnhandledExceptionEventHandler(otherAppDomain_UnhandledException);
Assembly assembly = otherAppDomain.Load("TheAssemblyThatThrows");
// But you might need to have MyClass inherit from MarshalByRefObject
MyClass instance = (MyClass)otherAppDomain.CreateInstanceAndUnwrap("TheAssemblyThatThrows", "MyClass");
instance.DoSomething();
Ответ №3:
Конечно, я не знаю, сколько вызовов сборок вы хотите изолировать, поэтому я не знаю, возможно ли это, но мне кажется, что создание фасада вокруг модуля, о котором вы говорите, было бы уместно.
Фасад будет перехватывать исключения, которые генерируются из этих конкретных сборок, и может повторно создавать пользовательское исключение с исходным исключением как InnerException
. Пользовательское исключение легко распознается глобальным обработчиком исключений.
Ответ №4:
вы могли бы написать его с нуля, но http://code.google.com/p/elmah / — отличная платформа для обработки необработанных исключений!
затем вы могли бы использовать http://code.google.com/p/elmah/wiki/ErrorFiltering для фильтрации по сборке с использованием отражения.