Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
сообщение об ошибке на клиенте
|
|||
|---|---|---|---|
|
#18+
Есть такая процедура: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Как получить текстовое сообщение, которое генерирует RAISE EXCEPTION ' ' на клиенте. У меня получается только обрабатывать RETURN. И еще это сообщение в pgAdmin я тоже не вижу. Клиент на Delphi. PostgreSQL 8.3.0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2008, 10:55 |
|
||
|
сообщение об ошибке на клиенте
|
|||
|---|---|---|---|
|
#18+
Во-первых, я что-то не увидел в процедуре raise exception. У вас ошибка просто подавляется и всё. Во-вторых, если raise таки будет, то в дельфях наверняка (я просто уже не помню, на джаве точно) будет возникать какой-нибудь sql-exception, отловив который можно покопаться во внутренностях и найти сообщение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2008, 12:39 |
|
||
|
сообщение об ошибке на клиенте
|
|||
|---|---|---|---|
|
#18+
pamirВо-первых, я что-то не увидел в процедуре raise exception. У вас ошибка просто подавляется и всё. Во-вторых, если raise таки будет, то в дельфях наверняка (я просто уже не помню, на джаве точно) будет возникать какой-нибудь sql-exception, отловив который можно покопаться во внутренностях и найти сообщение. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Прошу прощения. Вот исправленная функция. Я тоже надеялся, что будет до клиента долетать exception. И в MS SQL 2000 у меня все работало. А тут не получается. Возможно нужны особые настройки для сервера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2008, 12:54 |
|
||
|
сообщение об ошибке на клиенте
|
|||
|---|---|---|---|
|
#18+
Самая "правильная" версия функции: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. В pgAdmin также не вылетает exception, хотя возвращает 1, что свидетельствует о том, что исключение генерируется и обрабатывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2008, 13:01 |
|
||
|
сообщение об ошибке на клиенте
|
|||
|---|---|---|---|
|
#18+
по моему Вы сам и перехватываете исключение которое сгенерировали, тем самым подавляя сообщение об ошибке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2008, 13:01 |
|
||
|
сообщение об ошибке на клиенте
|
|||
|---|---|---|---|
|
#18+
Гость_0по моему Вы сам и перехватываете исключение которое сгенерировали, тем самым подавляя сообщение об ошибке Да. Так оно и есть. Спасибо за подсказку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2008, 13:12 |
|
||
|
сообщение об ошибке на клиенте
|
|||
|---|---|---|---|
|
#18+
nikolaich2 Гость_0по моему Вы сам и перехватываете исключение которое сгенерировали, тем самым подавляя сообщение об ошибке Да. Так оно и есть. Спасибо за подсказку.Во-во. Вы ж его генерите и тут же перехватываете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2008, 13:17 |
|
||
|
сообщение об ошибке на клиенте
|
|||
|---|---|---|---|
|
#18+
pamir nikolaich2 Гость_0по моему Вы сам и перехватываете исключение которое сгенерировали, тем самым подавляя сообщение об ошибке Да. Так оно и есть. Спасибо за подсказку.Во-во. Вы ж его генерите и тут же перехватываете. В MS SQL 2000 возможности обрабатывать exception в процедуре нет, а в PostgreSQL я только начал разбираться. Вот и получилась такая ерунда. И еще. Может посоветуете приличный способ передать информацию об ошибке на клиент. Я пока вижу следующие: - просто ловить exception на клиенте и потом с ним разбираться (но мне кажется, что будет не правильно не обработать исключение на сервере если есть такая возможность): - обрабатывать исключение на сервере, а на клиенте передавать соответсвующие коды или тексты через RETURNS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2008, 13:32 |
|
||
|
сообщение об ошибке на клиенте
|
|||
|---|---|---|---|
|
#18+
Поскольку зарайзить случившуюся и перехваченную ошибку нельзя (т.е. поймать её, что-то сделать и поднять дальше) я написал небольшую систему обработки ошибки. Гуру подскажут, может быть я был не прав, но мне понравилось (правда, система так и осталась в тестовом варианте. Это была самописка для одной игры, которая в итоге не понадобилась). Итак. На стороне БД 3 функции. 1. Собственно, делает raise exception, но пихает туда нужную мне информацию. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 2. Кодирует нужную информацию - вызывается внутри первой Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 3. Декодирует информацию. Используется, если для перехвата и разбора эксепшена на стороне сервера. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Ну и создал собственный тип Код: plaintext 1. 2. В любой серверной функции ошибки перехватываются (внутренние) либо, если это ошибка, которую мне надо сгенерить - генерится следующим образом. В каждой функции есть глобальная секция exception when others then В которой вызывается моя процедура (см. пример ниже). Если внутри функции нужно сгенерировать мою ошибку с моим текстом, я это делаю. Она перехватится глобальной секцией и поднимется уже кодированная. Пример: Код: plaintext 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. Таким образом, нужно поддерживать соглашение о структуре ЛЮБОЙ функции на стороне сервера - наличие глобального перехватчика в каждой функции. Как можно видеть, у меня присутствуют собственные стринговые коды ошибок. Если же ошибка постгреса (типа констрейнтов и т.п.) то они ловятся так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. И теперь, что на клиенте (правда, на джаве) Код: plaintext 1. 2. 3. 4. 5. 6. FpPgError - это класс, конструктор которого получает эксепшн. Парсит его текст, как это делает функция err_encode_exception, только на клиенте. Дальше я могу делать с ним что угодно - в нем содержится МОЙ код ошибки, МОЙ текст, который я могу показать пользователю. Проблема: я не стал заморачиваться на мультиязычность. По хорошему, надо расширить эту систему - по коду ошибки искать сообщение на языке пользователя. А по умолчанию, например, писать на русском (в принципе, можно сказать, что сейчас у меня всё работает "по умолчанию"). Да! Текст ошибки получается таким: <код_моей_ошибки=#=текст моей ошибки> либо, если это необработанная постгресовая ошибка (уникальность, которую я не поймал или ещё что-то) <PG.код_ошибки_постгреса.имя_функции_где_произошла=#=sqlerrm> sqlerrm - это постгресовый текст ошибки. Как он её выдает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2008, 14:10 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=35392799&tid=2004265]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
40ms |
get tp. blocked users: |
2ms |
| others: | 254ms |
| total: | 389ms |

| 0 / 0 |
