Перехватить оракловский Exception?
Перехватить оракловский Exception?
OracleStatus oracleStatus = new OracleStatus();
try {
...
}catch (Oracle.DataAccess.Client.OracleException oex){oracleStatus.Next(oex);if (oracleStatus.Current != EOracleStatus.Ignore){TExceptionHandler.Error(oex, "On step " + stepping + "\n\n" + sql);}}catch (Exception ex){TExceptionHandler.Error(ex, "On step " + stepping + "\n\n" + sql);}finally{
...
}
Код требует ссылки на Oracle.DataAccess.dll в проекте.
Дллок - две - х64 & х86.
Кроме этого может потребоваться перейти на Oracle.ManagetDataAccess.dll.
Должно сохранятся более/менее четкое разделение на чисто оракловские и нормальные ситемные ехцептионы...
Как лучше написать Катч? Ловить все и проверять имя типа?
Код требует ссылки на
Давай не мешать всё вместе: Врапперы и исключения
Не думаю, что есть абсолютно универсальное решение. Для каждого конкретного случая будет своё оптимальное.
Хотя бы, если подобная конструкция встречается пару раз или десяток.
Но по крайней мере, в приведенном коде нарушение принципа DRY.
Не думаю, что есть абсолютно универсальное решение.
-----
А универсальное и не требуется.
Пока нужно в одном проекте но в трех разных местах обрабатывать один стандартный и дав специальных набора ехцептионов.
В указанном коде - оракловские.
Но иметь в проекте прямую ссылку на либу - не хочется. Хочется ее в динамике грузить, описывая в конфиге.
А вот трекинг состояния и обработку специфически-оракловских ошибок хочется иметь...
или десяток
-----
Три раза по три применения...
Хотя... дополнительную обработку ошибок Я делал только для Оракла - в других местах просто ловится стандартный ехцептион...
Но планировать расширение - надо заранее.
приведенном коде нарушение принципа DRY
-----
Если бы только это...
Там сейчас обработку постгреешных ехцептионов делают по оракловским кодам...
Дополнительный катчер на этом фоне - вообще не проблема...
Не имею понятия, понравится ли тебе, но и идея следующая:
В коде пользуем интерфейс IDbExceptionHandler и IDbCaller (названия чисто чтобы было хоть как то было понятно за что отвечают)
IDbCaller возращает IDbExceptionHandler. Имплементация по собственному вкусу
IDbCaller возращает IDbExceptionHandler
-----
Гхмм... Не-а... не требуется ничего возвращать - все обрабатывается по месту - либо перезпрос данных, либо отправка сообщения об ошибке.
Вопрос был именно по перехвату специфических исключений - переделал: перехватываются все исключения, специфические для Оракла фильтруются по имени типа.
Все.
Ты видимо идею не понял
IDbExceptionHandler handler = dbCaller.GetExceptionHandler; try { ... } catch (Exception ex) { handler.Handle(ex, "On step {stepping}\n\n{sql}); } finally { ... }
Идею Я вполне понял - она на текущем этапе для меня избыточна.
То, что мне надо - отследить чисто оракловские ехцептионы и по ним принять решение что делать - отмечать сбой сетки и перезапрашивать данные или признавать ошибку за ошибку и обрабатывать.
Как будет обработана признаная ошибка (не сбой!) мне сейчас не интересно. Да и решаться оно будет не здесь, а внутри TExceptionHandler - там один рабочий обработчик и два неотлаженных.
Могу похвастаться - избавился от ссылок на всякие дллки провайдеров - все грузится в динамике, по заданному в конфиге...
она на текущем этапе для меня избыточна.
Хм,.. а что может быть еще проще интересно.
И как можно грузить ДЛЛ-ки без врапперов?
И как можно грузить ДЛЛ-ки без врапперов?
-----
Как у билли:
// original from DbProviderFactories.cs// modified to be debugged on place.static public DbProviderFactory GetFactory(DataRow providerRow){// fail with ConfigProviderMissing rather than ColumnNotInTheTable exceptionDataColumn column = providerRow.Table.Columns["AssemblyQualifiedName"];if (null != column){// column value may not be a stringstring assemblyQualifiedName = providerRow[column] as string;if (!String.IsNullOrEmpty(assemblyQualifiedName)){// FXCop is concerned about the following line call to Get Type,// If this code is deemed safe during our security review we should add this warning to our exclusion list.// FXCop Message, pertaining to the call to GetType.//// Secure late-binding methods,System.Data.dll!System.Data.Common.DbProviderFactories.GetFactory(System.Data.DataRow):System.Data.Common.DbProviderFactory,Type providerType = Type.GetType(assemblyQualifiedName);if (null != providerType){System.Reflection.FieldInfo providerInstance = providerType.GetField("Instance", System.Reflection.BindingFlags.DeclaredOnly | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);if (null != providerInstance){//Debug.Assert(providerInstance.IsPublic, "field not public");//Debug.Assert(providerInstance.IsStatic, "field not static");if (providerInstance.FieldType.IsSubclassOf(typeof(DbProviderFactory))){object factory = providerInstance.GetValue(null);if (null != factory){return (DbProviderFactory)factory;}// else throw ConfigProviderInvalid}// else throw ConfigProviderInvalid}throw new Exception("ConfigProviderInvalid");}throw new Exception("ConfigProviderNotInstalled");}// else throw ConfigProviderMissing}throw new Exception("ConfigProviderMissing");}
Можно и оригинальный файлик посмотреть - тут Я для отладки "загрубил" проверки и ехцептионы на один язык.
Остальное - описывается в апп.конфиг.
что может быть еще проще интересно.
-----
Там вроде есть - вызов статического метода класса. Все переключения обработчиков - в нем. Ну не нужно мне таскать ссылки на обработчик по всему коду.
ни разу не пользовал за ненадобностью и нелюбви к АДО.НЕТ
А разве не есть DbProviderFactory враппер к ADO.NET?
Все равно ведь недостаточно
http://csharpdocs.com/generic-data-access-layer-in-c-using...
Ну не нужно мне таскать ссылки на обработчик по всему коду.
Для этого вроде IOC либы придумали или ...?
https://www.hanselman.com/blog/ListOfNETDependencyInjectio...
А разве не есть DbProviderFactory враппер к ADO.NET?
-----
Вроде как нет.
По крайней мере у меня никаких проблем не возникло при коннектах к Ораклу и Постгрее через их дллки...
Да и не должно - там прописано создание типа "Фабрика". У каждого - своя.
А какую именно брать - в конфиге... хотя можно слепить табличку самому и скинуть строку как хочешь...
По ссылке... хммм... там слишком сложно... да, все по порядку... но многовато кода... и все одно менеджера
дорабатывать придется...
или ...?
-----
Для меня - или - времени нет... контракторы такую галиматью слепили, что разгребать не знаю сколько...
У меня были сделаны бизнес-объекты... и большая часть работы делалась через них...
Ребятки посмотрели - что-то - есть... зачем - непонятно... базе - не соответствует... ну и скакнули на прямую...
Потом орали как резанные - у нас опять ничего не работает - ну а как оно будет работать если скл в объектах - оркловский, а база постгрее...
Так что мне сейчас хоть как-то запустить поломанное...
Так что мне сейчас хоть как-то запустить поломанное...
ладно, тогда не отвлекаю на ерунду разную. Успехов.