Я попытался переопределить метод Render, но он не охватывает все исключения.
Например, если во время Page_Init, Load или Render генерируется какое-то исключение, это предотвратит отображение страницы.
У нас есть разные люди, работающие над разными модулями (элементами управления), которые могут быть загружены на одну страницу, но я не отвечаю за качество кода каждого модуля, поэтому даже если это не лучшая практика, мне нужно было перехватывать исключения и определять, какой элемент управления не загружается, потому что приложение не может завершиться сбоем только потому, что один модуль не работает.
Для этого конкретного сценария, который не так уж редок в наше время, ни пользовательская, ни прикладная, ни обработка ошибок страницы не будут работать хорошо.
Решение, которое я придумал, было:
Каждый модуль (Control.ascx), когда его необходимо загрузить на страницу (aspx), содержится в ModuleShell, который будет содержать некоторые специфические функции и будет отвечать за правильную работу обработки Page_Error.
Этот ModuleShell, вместо того, чтобы пытаться перехватить исключение дочернего элемента управления, который вышел из строя, будет просто отслеживать на каждом этапе жизненного цикла, если ему удалось правильно загрузить.
Вот фрагмент кода:
protected void Page_Init(object sender, EventArgs e)
{
Modules.CurrentState = _mod;
}
protected void Page_Load(object sender, EventArgs e)
{
Modules.CurrentState = _mod;
}
protected void Page_PreRender(object sender, EventArgs e)
{
Modules.CurrentState = _mod;
}
Модули - это статический класс, используемый для хранения переменных сеанса.
CurrentState - это переменная, которую ModuleShell использует для записи своих имен.
Page_Error, расположенная в единственном aspx, который мы получили, получит последний записанный ModuleShell, который пытался загрузить. Так как любое исключение прекратит рендеринг страницы, последняя из которых ModuleShell записала свое имя на главную страницу, вероятно, она не была загружена должным образом.
Это небрежное решение, но оно прозрачно для разработчика модулей.