Мой предпочтительный подход - написать собственный HttpModule, чтобы перехватывать и регистрировать все ошибки. После регистрации ошибки вы можете перенаправить пользователя на страницу ошибки - такой подход, который я видел, чаще всего используется для пользовательской обработки ошибок в SharePoint.
В вашем HttpModule вы можете использовать подход, подобный описанному Дэниелом, для записи исключений в журналы ULS.
Вот простой пример этого:
Создайте класс, который реализует IHttpModule, и подключите соответствующее событие в конвейере Http:
public void Init(HttpApplication context)
{
context.Error += new EventHandler(context_Error);
}
В событии context_Error просмотрите все ошибки и зарегистрируйте их ...
void context_Error(object sender, EventArgs e)
{
TraceProvider.RegisterTraceProvider();
foreach (var ex in HttpContext.Current.AllErrors)
{
TraceProvider.WriteTrace(0,
TraceProvider.TraceSeverity.Exception,
Guid.NewGuid(),
Assembly.GetExecutingAssembly().FullName,
"<your application name>",
"<exception category>",
ex.ToString());
}
TraceProvider.UnregisterTraceProvider();
HttpContext.Current.Server.ClearError();
HttpContext.Current.Response.Clear();
HttpContext.Current.Server.Transfer("/_layouts/Error500.aspx");
}
Вы, конечно, должны объединить все это в функцию (определенную на уровне веб-приложений) и развернуть ее в SharePoint.
Обратите внимание, что ваша запись в разделе web.config для этой пользовательской ошибки http-модуля должна быть первой в списке. Порядок, в котором перечислены http-модули в разделе, имеет значение, и модуль http с пользовательской ошибкой всегда должен выполняться первым.