|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
напоролся на Ora-01013 на пром стенде. до этого не знал о существовании exceptions, которые не перехватываются блоком when others. очень не хочется повторения сюрприза. собственно вопрос: есть ли еще какие нибудь исключений, требующие отдельного ухода? мб кто-нибудь поделится -как правильно писать обработку исключений с учетом таких вот особенностей. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 16:07 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
legg есть ли еще какие нибудь исключений, требующие отдельного ухода? Конечно есть. Помимо исключений, связанных с логином или с потерей соединения к подобным относятся "обертки" над аварийным завершением серверного процесса (например, ORA-600, ORA-7445) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 16:24 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
andrey_anonymous legg есть ли еще какие нибудь исключений, требующие отдельного ухода? Конечно есть. Помимо исключений, связанных с логином или с потерей соединения к подобным относятся "обертки" над аварийным завершением серверного процесса (например, ORA-600, ORA-7445) если сессия отваливается - то вопрос сам снимается. проблема как раз когда сессия вошла в процедуру, наапдейтила -навыставляла юзерлоки и вылетела по 01013. И после этого занялась другими делами спокойно. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 17:04 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
legg andrey_anonymous пропущено... Конечно есть. Помимо исключений, связанных с логином или с потерей соединения к подобным относятся "обертки" над аварийным завершением серверного процесса (например, ORA-600, ORA-7445) если сессия отваливается - то вопрос сам снимается. проблема как раз когда сессия вошла в процедуру, наапдейтила -навыставляла юзерлоки и вылетела по 01013. И после этого занялась другими делами спокойно. получается что незавершенная транзакция так и зависает в раскуроченном состоянии на веки вечные (пока сессия не закончится по каким то другим причинам). ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 17:06 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
[quot legg#22311566] legg получается что незавершенная транзакция так и зависает в раскуроченном состоянии на веки вечные (пока сессия не закончится по каким то другим причинам). А чем это отличается от вызова процедуры в которой вообще нет блока exception? Вернее, процедура в которой есть блок exception в 95% случаев это плохой дизайн. Обработка исключения это дело клиента. То же исключение в той же процедуре но вызванной из другой части приложения во многих случаях вызывает разную реакцию. Далее, любой код приложения без try catch рано или поздно выстрелит. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 19:02 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
SY Вернее, процедура в которой есть блок exception в 95% случаев это плохой дизайн. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 19:09 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
SY А чем это отличается от вызова процедуры в которой вообще нет блока exception? именно так. ничем в данном случае. SY Вернее, процедура в которой есть блок exception в 95% случаев это плохой дизайн. Обработка исключения это дело клиента. так изначально и задумывалось в проекте, насколько знаю (те, кто начинал эту историю - свалили). и я неоднократно слышал что клиент должен исключения обрабатывать. но 1. я не хочу показаться упертым бараном, но буду! или я не просто не могу переломить мозг в правильном направлении или в данном случае - исключение 2. подробнее: по бизнес логике процедура должна работать со счетом в монопольном режиме. для этого выставляется юзер лок по счету (наименование ul содержит id счета). Если счет уже заблокирован - ждем пока юзер блок не будет снят. После того как процедура отработана - блокировку снимаем. В блоке EXCEPTION WHEN OTHERS также снимаем блокировку а EXCEPTION или превращаем в ответ пользователю или рейзим. Такой способ блокировки написал не я но не вижу в нем ничего плохого. Не видел до тех пор пока не обнаружилось что часть вызовов прерывается пользователем, сессия начинает выполнять другие задачи, а блокировка так и остается висеть. Неужели обязанность проверить блокировку счета и снять ее при ее наличии в данном случае правильнее возложить на клиента? Ему чисто технически это сложнее сделать, тем более что он инициирует не один вызов процедуры а целый цикл (входной параметр - массив документов). ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 20:10 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
legg SY А чем это отличается от вызова процедуры в которой вообще нет блока exception? именно так. ничем в данном случае. SY Вернее, процедура в которой есть блок exception в 95% случаев это плохой дизайн. Обработка исключения это дело клиента. так изначально и задумывалось в проекте, насколько знаю (те, кто начинал эту историю - свалили). и я неоднократно слышал что клиент должен исключения обрабатывать. но 1. я не хочу показаться упертым бараном, но буду! или я не просто не могу переломить мозг в правильном направлении или в данном случае - исключение 2. подробнее: по бизнес логике процедура должна работать со счетом в монопольном режиме. для этого выставляется юзер лок по счету (наименование ul содержит id счета). Если счет уже заблокирован - ждем пока юзер блок не будет снят. После того как процедура отработана - блокировку снимаем. В блоке EXCEPTION WHEN OTHERS также снимаем блокировку а EXCEPTION или превращаем в ответ пользователю или рейзим. Такой способ блокировки написал не я но не вижу в нем ничего плохого. Не видел до тех пор пока не обнаружилось что часть вызовов прерывается пользователем, сессия начинает выполнять другие задачи, а блокировка так и остается висеть. Неужели обязанность проверить блокировку счета и снять ее при ее наличии в данном случае правильнее возложить на клиента? Ему чисто технически это сложнее сделать, тем более что он инициирует не один вызов процедуры а целый цикл (входной параметр - массив документов). да по сути не важно где этот самый блок exception. Тема интересная, но не о том. Клиент ровно так же должен будет выловить и обработать исключение. вопрос - как сделать это надежно на 100%? WHEN OTHERS не хватает. Как минимум надо проверить 01013 персонально. А есть еще что-то подобное? Смерть сессии не считается. Нет сессии - незафиксированные транзакции и блокировки самоликвидируются. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 20:22 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
legg да по сути не важно где этот самый блок exception. Тема интересная, но не о том. Клиент ровно так же должен будет выловить и обработать исключение. вопрос - как сделать это надежно на 100%? WHEN OTHERS не хватает. Как минимум надо проверить 01013 персонально. А есть еще что-то подобное? Смерть сессии не считается. Нет сессии - незафиксированные транзакции и блокировки самоликвидируются. Try catch или аналог для используемого клиента. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 21:24 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
SY legg да по сути не важно где этот самый блок exception. Тема интересная, но не о том. Клиент ровно так же должен будет выловить и обработать исключение. вопрос - как сделать это надежно на 100%? WHEN OTHERS не хватает. Как минимум надо проверить 01013 персонально. А есть еще что-то подобное? Смерть сессии не считается. Нет сессии - незафиксированные транзакции и блокировки самоликвидируются. Try catch или аналог для используемого клиента. SY. а дальше? вызов процедуры аварийного завершения, которая будет проверять, какие блокировки выставлены исходной процедурой и снимать их? мб это по феншую, но я пока не дорос до его осознания. на уровне процедуры перехватить - проще и быстрее и понятнее же. чем больше думаю - тем больше смысла вижу в таком дизайне. однако поздно. там есть еще препятствия. Вы совсем меня заплюете - но коммиты-роллбеки я волевым решением тоже у клиента отобрал, иначе очень сильно логика усложнялась:). Но это уже оверофтоп. а еще - это передача проблемы в другую команду разработчиков. не хочу и не буду). если дойдет дело до рефакторинга - я еще раз как следует подумаю , но сейчас таки и а все-таки: как гарантированно перехватить все исключения (при которых сессия не умирает) в блоке EXCEPTION или такая информация просто отсутствует? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 22:44 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
legg как гарантированно перехватить все исключения (при которых сессия не умирает) в блоке EXCEPTION или такая информация просто отсутствует? Никак. Чтобы сделать что-нибудь нужно иметь управление, а если клиент завершает CALL, например по Ora-01013, исполнение текущего кода прерывается. При этом сама сессия может оставаться в добром здравии и готова к дальнейшим действиям. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 00:07 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
AlexFF__| legg как гарантированно перехватить все исключения (при которых сессия не умирает) в блоке EXCEPTION или такая информация просто отсутствует? Никак. Чтобы сделать что-нибудь нужно иметь управление, а если клиент завершает CALL, например по Ora-01013, исполнение текущего кода прерывается. При этом сама сессия может оставаться в добром здравии и готова к дальнейшим действиям. не совсем так. исключение перехватывается при проверке его персонально: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
в итоге не придумал ничего лучше, чем в процедурах с выставлеными юзерлоками писать Код: plsql 1. 2. 3. 4. 5.
и озадачен вопросом - а нет ли еще какого исключения, со свойствами 1013? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 00:34 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
legg не совсем так. исключение перехватывается при проверке его персонально: интересно отработает ли Ваш код если user requested cancel of current на клиенте, напр от ODBC ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 09:23 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
legg, Есть мнение, что если процедура что-то делает и в случае успеха выполняет коммит, то процедуру стоит оформить в виде автономной транзакции. Конкретно с Ora-01013 не проверял, но, т.к. автономная транзакция должна выполнять rollback в случае необработанных ошибок, думается это может сработать (и блокировки должны сняться сами при выходе из процедуры как при завершении сессии). ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 09:31 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
delphinotes legg, Есть мнение, что если процедура что-то делает и в случае успеха выполняет коммит, то процедуру стоит оформить в виде автономной транзакции. Конкретно с Ora-01013 не проверял, но, т.к. автономная транзакция должна выполнять rollback в случае необработанных ошибок, думается это может сработать (и блокировки должны сняться сами при выходе из процедуры как при завершении сессии). нет. не снимается, хоть от ролбэчься пруф: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
и пока не убоем сессию - лок висит select * from sys.dbms_lock_allocated nm, v$lock lck where nm.name ='dolbannaya_user_lock' and nm.lockid=lck.id1; ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 10:20 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
legg, это не автономная транзакция. Оформи свою процедуру с прагмой: Код: plsql 1.
(либо оберни вызов своей процедуры в другую с этой прагмой и дёргай из клиента обёртку) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 10:29 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
delphinotes legg, это не автономная транзакция. Оформи свою процедуру с прагмой: Код: plsql 1.
(либо оберни вызов своей процедуры в другую с этой прагмой и дёргай из клиента обёртку) я не вижу разницы в данном случае) но ок: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
и в другой сессии Код: plsql 1.
замечательно возвращает результат ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 10:45 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
legg, а вызвать dbms_lock.request с параметром release_on_commit => true религия не позволяет? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 11:00 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
я то вот о чём, при оформлении процедуры как автономная транзакция, rollback можно явно не писать, и ecxeption блок можно тоже опустить (если конечно не нужно это записать в протокол), т.е. твоё пример может выглядеть так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
и пока оно работает - блокировка висит. Если прервать по OCI_BREAK, то хоть явного rollback и нету, но блокировка уйдёт, т.к. rollback будет не явный ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 11:11 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
Stax legg не совсем так. исключение перехватывается при проверке его персонально: интересно отработает ли Ваш код если user requested cancel of current на клиенте, напр от ODBC ..... stax отрабатывает. я проверил. работает как в pl/sql developer: попробуйте щелкнуть молнию break с закомментареным блоком EXCEPTION и раскомментаренным: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
на боевом клиенте тоже проверил (клиент работает с оракловым universal connection pull ) - в логах увидел что процедура исключение перехватывать начала, т.о. минимальное решение найдено. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 11:12 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
delphinotes я то вот о чём, при оформлении процедуры как автономная транзакция, rollback можно явно не писать, и ecxeption блок можно тоже опустить (если конечно не нужно это записать в протокол), т.е. твоё пример может выглядеть так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
и пока оно работает - блокировка висит. Если прервать по OCI_BREAK, то хоть явного rollback и нету, но блокировка уйдёт, т.к. rollback будет не явный долго доходило, но понял о чем речь. да, , release_on_commit => true тут сыграет. К сожалению в моем конкретном случае потребуется переписывать серьезно логику. Есть промежуточные фиксации транзакций при обращении к внешним системам. В автономки их просто так не вывести, а блокировку снимать нельзя. Но как дело дойдет до планируемого рефакторинга (он рано или поздно будет) - возможно именно так и сделаю. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 11:20 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
legg, а если промежуточные фиксации обернуть вложенными автономками? (Я такого ещё не делал, не было необходимости) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 11:25 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
delphinotes legg, а если промежуточные фиксации обернуть вложенными автономками? (Я такого ещё не делал, не было необходимости) Что то подобное я и хотел сделать ещё до того как столкнулся с проблемой юзерлоков. Но там нужно продумать все как следует. Впопыхах делать не хочу, и наиболее безопасное решение пока что выбрал - обработка именованного исключения. Вариант некрасивый, но требует минимального вмешательства в код. Вообще эти промежуточные фиксации конечно же оч сомнительное решение имхо. Но написано до меня. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 11:48 |
|
как перехватить все исключения?
|
|||
---|---|---|---|
#18+
AlexFF__| Чтобы сделать что-нибудь нужно иметь управление, а если клиент завершает CALL, например по Ora-01013, исполнение текущего кода прерывается. При этом сама сессия может оставаться в добром здравии и готова к дальнейшим действиям. Именно. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 13:32 |
|
|
start [/forum/topic.php?fid=52&msg=40064230&tid=1880267]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 157ms |
0 / 0 |