У меня есть постбэк Ajax, в котором я делаю запрос SQL Server. Структура слишком сложна для размещения здесь. Если у меня customErrors = Off ", то ошибка возвращается клиенту в ответе HTTP, откуда я его вынимаю и показываю пользователю соответствующие вещи:
114 | ошибка | 500 | Истекло время ожидания. Время ожидания истекло до
завершение операции или сервер не отвечает. |
У меня есть другие "исключения приложения", которые я также ловлю на клиенте таким же образом. Все это бесплатно: asp.net помещает вышеуказанный материал в ответ http без моей помощи.
Затем я включаю customErrors = On, потому что в других случаях я не хочу показывать пользователям полный дамп стека. На этом этапе все мои исключения, как указано выше, удаляются из сообщения, поэтому они становятся просто:
0 | ошибка | 500 ||
Что вполне разумно. Затем я добавляю некоторую обработку исключений в свой код обратной передачи Ajax, чтобы перехватить ошибки приложения ... и затем я явно записываю данные об исключениях, которые мне нужны, обратно клиенту:
39 | error | 202 | У вас нет доступа к этой записи. |
Это все хорошо работает.
В этом случае проблема связана с одним конкретным типом исключения - таймауты базы данных SQL Server. Похоже, что это общие «необработанные исключения», за исключением исключения времени ожидания базы данных. Подвох в том, что это исключение совсем не касается моего обработчика - я не могу найти его и сообщить, что я хочу!
Глядя на трассировки исключений, трасса тайм-аута, конечно, длиннее моей трассировки «у вас нет доступа», потому что она связывает несколько вещей, прежде чем она достигнет моего (принудительного для целей тестирования) таймаута. Глядя только на последние биты двух трасс, я получаю (приложение Eception):
System.Web.HttpUnhandledException (0x80004005): Exception of type System.Web.HttpUnhandledException' was thrown. ---> System.ApplicationException: You do not have access to this record.
at pages_***.HideEventLists(Boolean becauseNotAccessible) in *
at pages_**.AjaxTabLoad(Object sender, AjaxTabEventArgs e) in *
at userControls_tabs.panel_Load(Object sender, EventArgs e) in *
at System.Web.UI.Control.OnLoad(EventArgs e)
Versus (время ожидания SQL Server):
System.Web.HttpUnhandledException (0x80004005): Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
Итак, мне интересно, где именно я должен перехватывать исключение тайм-аута SQL Server? Я не хочу обернуть каждый доступ к базе данных своим собственным обработчиком! Что я могу сделать, чтобы передать это исключение так же, как исключение моего приложения?