Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

​Перехватить оракловский Exception?

468  
Murr_0001 местный житель17.02.20 18:10
Murr_0001
NEW 17.02.20 18:10 

Перехватить оракловский 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.


Должно сохранятся более/менее четкое разделение на чисто оракловские и нормальные ситемные ехцептионы...


Как лучше написать Катч? Ловить все и проверять имя типа?

#1 
AlexNek патриот17.02.20 18:54
AlexNek
17.02.20 18:54 
в ответ Murr_0001 17.02.20 18:10
Код требует ссылки на

Давай не мешать всё вместе: Врапперы и исключения смущ

Не думаю, что есть абсолютно универсальное решение. Для каждого конкретного случая будет своё оптимальное.

Хотя бы, если подобная конструкция встречается пару раз или десяток.

Но по крайней мере, в приведенном коде нарушение принципа DRY.

#2 
Murr_0001 местный житель17.02.20 23:09
Murr_0001
NEW 17.02.20 23:09 
в ответ AlexNek 17.02.20 18:54

Не думаю, что есть абсолютно универсальное решение.

-----

А универсальное и не требуется.

Пока нужно в одном проекте но в трех разных местах обрабатывать один стандартный и дав специальных набора ехцептионов.

В указанном коде - оракловские.

Но иметь в проекте прямую ссылку на либу - не хочется. Хочется ее в динамике грузить, описывая в конфиге.

А вот трекинг состояния и обработку специфически-оракловских ошибок хочется иметь...


или десяток

-----

Три раза по три применения...

Хотя... дополнительную обработку ошибок Я делал только для Оракла - в других местах просто ловится стандартный ехцептион...

Но планировать расширение - надо заранее.



приведенном коде нарушение принципа DRY

-----

Если бы только это...

Там сейчас обработку постгреешных ехцептионов делают по оракловским кодам...

Дополнительный катчер на этом фоне - вообще не проблема...

#3 
AlexNek патриот18.02.20 12:41
AlexNek
NEW 18.02.20 12:41 
в ответ Murr_0001 17.02.20 23:09

Не имею понятия, понравится ли тебе, но и идея следующая:

В коде пользуем интерфейс IDbExceptionHandler и IDbCaller (названия чисто чтобы было хоть как то было понятно за что отвечают)

IDbCaller возращает IDbExceptionHandler. Имплементация по собственному вкусу спок

#4 
Murr_0001 местный житель18.02.20 13:01
Murr_0001
NEW 18.02.20 13:01 
в ответ AlexNek 18.02.20 12:41

IDbCaller возращает IDbExceptionHandler

-----

Гхмм... Не-а... не требуется ничего возвращать - все обрабатывается по месту - либо перезпрос данных, либо отправка сообщения об ошибке.

Вопрос был именно по перехвату специфических исключений - переделал: перехватываются все исключения, специфические для Оракла фильтруются по имени типа.

Все.

#5 
AlexNek патриот18.02.20 13:10
AlexNek
NEW 18.02.20 13:10 
в ответ Murr_0001 18.02.20 13:01

Ты видимо идею не понял смущ

IDbExceptionHandler handler = dbCaller.GetExceptionHandler;
try {
...
}
catch (Exception ex)
{
   handler.Handle(ex, "On step {stepping}\n\n{sql});
}            
finally
{
...
}
#6 
Murr_0001 местный житель18.02.20 17:36
Murr_0001
NEW 18.02.20 17:36 
в ответ AlexNek 18.02.20 13:10

Идею Я вполне понял - она на текущем этапе для меня избыточна.

То, что мне надо - отследить чисто оракловские ехцептионы и по ним принять решение что делать - отмечать сбой сетки и перезапрашивать данные или признавать ошибку за ошибку и обрабатывать.

Как будет обработана признаная ошибка (не сбой!) мне сейчас не интересно. Да и решаться оно будет не здесь, а внутри TExceptionHandler - там один рабочий обработчик и два неотлаженных.


Могу похвастаться - избавился от ссылок на всякие дллки провайдеров - все грузится в динамике, по заданному в конфиге...

#7 
AlexNek патриот18.02.20 19:32
AlexNek
NEW 18.02.20 19:32 
в ответ Murr_0001 18.02.20 17:36
она на текущем этапе для меня избыточна.

Хм,.. а что может быть еще проще интересно.

И как можно грузить ДЛЛ-ки без врапперов?

#8 
Murr_0001 местный житель19.02.20 11:19
Murr_0001
NEW 19.02.20 11:19 
в ответ AlexNek 18.02.20 19:32

И как можно грузить ДЛЛ-ки без врапперов?

-----

Как у билли:


// original from DbProviderFactories.cs
// modified to be debugged on place.
static public DbProviderFactory GetFactory(DataRow providerRow)
{
// fail with ConfigProviderMissing rather than ColumnNotInTheTable exception
DataColumn column = providerRow.Table.Columns["AssemblyQualifiedName"];
if (null != column)
{
// column value may not be a string
string 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");
}




Можно и оригинальный файлик посмотреть - тут Я для отладки "загрубил" проверки и ехцептионы на один язык.

Остальное - описывается в апп.конфиг.


что может быть еще проще интересно.

-----

Там вроде есть - вызов статического метода класса. Все переключения обработчиков - в нем. Ну не нужно мне таскать ссылки на обработчик по всему коду.

#9 
AlexNek патриот19.02.20 13:01
AlexNek
NEW 19.02.20 13:01 
в ответ Murr_0001 19.02.20 11:19

ни разу не пользовал за ненадобностью и нелюбви к АДО.НЕТ

А разве не есть DbProviderFactory враппер к ADO.NET?

Все равно ведь недостаточно

http://csharpdocs.com/generic-data-access-layer-in-c-using...


Ну не нужно мне таскать ссылки на обработчик по всему коду.

Для этого вроде IOC либы придумали или ...?

https://www.hanselman.com/blog/ListOfNETDependencyInjectio...

#10 
Murr_0001 местный житель19.02.20 16:48
Murr_0001
NEW 19.02.20 16:48 
в ответ AlexNek 19.02.20 13:01

А разве не есть DbProviderFactory враппер к ADO.NET?

-----

Вроде как нет.

По крайней мере у меня никаких проблем не возникло при коннектах к Ораклу и Постгрее через их дллки...

Да и не должно - там прописано создание типа "Фабрика". У каждого - своя.

А какую именно брать - в конфиге... хотя можно слепить табличку самому и скинуть строку как хочешь...

По ссылке... хммм... там слишком сложно... да, все по порядку... но многовато кода... и все одно менеджера

дорабатывать придется...


или ...?

-----

Для меня - или - времени нет... контракторы такую галиматью слепили, что разгребать не знаю сколько...

У меня были сделаны бизнес-объекты... и большая часть работы делалась через них...

Ребятки посмотрели - что-то - есть... зачем - непонятно... базе - не соответствует... ну и скакнули на прямую...

Потом орали как резанные - у нас опять ничего не работает - ну а как оно будет работать если скл в объектах - оркловский, а база постгрее...

Так что мне сейчас хоть как-то запустить поломанное...

#11 
AlexNek патриот19.02.20 17:59
AlexNek
NEW 19.02.20 17:59 
в ответ Murr_0001 19.02.20 16:48
Так что мне сейчас хоть как-то запустить поломанное...

ладно, тогда не отвлекаю на ерунду разную. Успехов.

#12