Обработка исключений в ASP.NET (С#) из отдельного файла класса

Вопрос:

Я пишу приложение ASP.NET в С#, и я работаю над обработкой возможных исключений, которые могут быть выбраны из другого файла. У меня есть файл класса С#, который я написал, содержащий методы, которые выполняют команды SQL, и я хочу защитить от возможных исключений, возникающих после того, как мое приложение переходит в производство.

Это метод SQL, который я написал, что я намеренно бросаю ошибку в (From SqlData.cs):

public SqlConnection openConnection()
{
//Create an SQL connection
SqlConnection myConnection = new SqlConnection("My intentionally incorrect connection string");

//Open the connection
try
{
myConnection.Open();
}
catch (SqlException myAppEx)
{
throw new ApplicationException("There was an error opening the SQL database connection", myAppEx);
}

return myConnection;
}

Я вызываю этот метод из файла Default.aspx.cs со следующими строками кода:

try
{
//The ReadDT method calls openConnection() in itself
dt = sqlData.ReadDT(query);
}
catch (ApplicationException exc)
{
throw exc;
}

Я пытаюсь реализовать обработку исключений на уровне страницы, где, если на текущей странице возникает исключение, должен быть вызван метод Page_Error, как это процитировано здесь. Вот почему я поймаю исключение, которое было выброшено из моего файла класса SqlData.cs, и повторно выбросит исключение, так что это исключение увидит сервер. Следовательно, Server.GetLastError() не возвращает значение null.

Как реализовано здесь, у меня есть отдельная страница с ошибкой, которая отображает всю информацию об исключении. Мой метод Page_Error выглядит следующим образом:

private void Page_Error(object sender, EventArgs e)
{
Server.Transfer("ErrorPage.aspx?handler=Page_Error%20-%20Default.aspx", true);
}

Отсюда пользователь перенаправляется на мой ErrorPage.aspx, и SqlException которое было изначально выбрано, отображается отлично.

Проблема. Когда я улавливаю исключение из SqlData.cs и перебрасываю исключение, возникает исключение UnhandledException. если я не ставил блок catch try во время вызова метода ReadDT, то такое же UnhandledException возникает из моего файла SqlData.cs.

Трассировка кода:

  1. throw new ApplicationException("There was an error opening the SQL database connection", myAppEx); (Это работает правильно)
  2. Исключение затем захватывается и повторно бросается (происходит UnhandledException)
  3. Метод Page_Error вызывается так, как должно быть, и все выполняется правильно!

Надеюсь, что я ясно ответил на вопросы, я провел много исследований по исключениям и моей конкретной проблеме, и я не имел никакого успеха в поиске ответа.

Спасибо, Эрик

Лучший ответ:

Поэтому я придумал комбинацию обработки ошибок с помощью обработки исключений Code Level и перенаправил пользователя на страницу с ошибкой, а затем зарегистрировал ошибку с ELMAH, чтобы решить мою проблему.

Теперь я обрабатываю все исключения непосредственно в файле класса SqlData, для наименее эффективного кода. У меня есть глобальный HttpResponse response в моем файле класса SqlData, который я заполняю каждый раз, когда создаю новый экземпляр класса из моего приложения ASP.NET. Итак, из моего файла Main.aspx.cs у меня есть что-то вроде:

private SQLData data;

protected void Page_Load(object sender, EventArgs e)
{
    data = new SQLData(Response);
    ...
}

Если я это сделаю, я могу вызвать response.Redirect() из моего файла класса, чтобы отправить пользователя на мою страницу с ошибкой, я передаю сообщение об ошибке исключения и тип исключения в строке запроса, к которому я затем распечатываю пользователя на моей странице ошибок. Это позволяет мне отображать пользователю только нечувствительную информацию. Поэтому исключение было обработано, и ELMAH зарегистрировал всю специфику!

//Create an SQL connection
SqlConnection myConnection = new SqlConnection("MyConnString");

//Open the connection
try
{
    myConnection.Open();
}
catch (Exception ex)
{
    //Manually log the exception in ELMAH
    Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
    //Redirect the user to the error page
    response.Redirect("ErrorPage.aspx?ErrorMessage=" + ex.Message + "&ErrorType=SQLException", true);
}

return myConnection;

Затем я показываю ссылку в нижней части моей страницы ошибок, направляя ее на страницу elamh.axd только если вы являетесь администратором. На этой странице вы можете просмотреть трассировку стека и другую конфиденциальную информацию.

Вы можете найти информацию об ELMAH в нижней части этой страницы, а также настроить ELMAH в приложении ASP.NET. Это очень легко сделать и очень мощный инструмент.

Приветствия, Эрик

Ответ №1

В ASP.NET необработанные исключения, созданные вашим приложением, будут завернуты в исключение HttpUnhandledException перед вызовом обработчика ошибок Page или Global. Вам нужно посмотреть его свойство InnerException чтобы получить исходное исключение.

В общем, вы не должны беспокоиться об обертывании и повторном исключении, как вы делаете, если вы не добавляете значение (например, дополнительные данные относительно контекста исключения). Просто позвольте им распространяться туда, где они в конечном итоге обрабатываются (Page_Error в вашем случае, хотя вы можете рассмотреть использование Application_Error в global.asax.cs, чтобы избежать повторения этого кода обработки ошибок на каждой странице).

Оцените статью
TechArks.Ru
Добавить комментарий