как бросить исключение из класса обратно в форму, которая его вызвала - PullRequest
0 голосов
/ 01 марта 2012

Здравствуйте, у меня есть обычная WinForm, которая вызывает это:

private void childDirectoryToolStripMenuItem_Click(object sender, EventArgs e)
{
     try
     {
         SQL.createTable("childDirectory"); //THIS LINE
     }
     catch(SystemException ecp)
     {
         MessageBox.Show(string.Format("An error occurred: {0}", ecp.Message));
     }
}

и у меня есть класс с именем «SQL».Класс C # не может выдать messageBox пользователю, только Console.WriteLine:

static public void createTable(string tableToCreate)
        {
            try
            {
                .
                .
                .
                .
            }
            catch (SqlException exp)
            {
                Console.WriteLine("Database not created: " + exp.Message, "Error");
            }
        }

Как я могу выбросить эту SqlExecption обратно в вызов Form.cs?Извините, если моя формулировка неверна, надеюсь, вы понимаете, что я пытаюсь сделать.

Ответы [ 3 ]

2 голосов
/ 01 марта 2012
    static public void createTable(string tableToCreate)
    {
        try
        {
            .
            .
            .
            .
        }
        catch (SqlException exp)
        {
            Console.WriteLine("Database not created: " + exp.Message, "Error");
            throw exp;
        }
    }

И перехватить его с помощью:

 private void childDirectoryToolStripMenuItem_Click(object sender, EventArgs e)
 {
     try
     {
          SQL.createTable("childDirectory"); //THIS LINE
     }
     catch(SystemException ecp)
     {
        MessageBox.Show(string.Format("An error occurred: {0}", ecp.Message));
     }
     catch (SqlException exp)
     {               

     }
 }

Но если это не нужно, вам не нужно перехватывать исключение в вызываемом методе, если вы ловите его в вызывающем методе.

1 голос
/ 01 марта 2012

Почему бы просто не позволить ошибке распространиться до формы окна и избежать двойной зацепки? Вы можете сделать запись там.

Однако, если вы действительно хотите сделать это таким образом, тогда вы просто позвоните throw. Это просто отбросит исключение. Плюсом этого метода перед throw exp является то, что он сохранит исходную трассировку стека и не будет вводить в заблуждение любую отладку. Уже проверенное объяснение этому можно найти по адресу: Как правильно перебрасывать исключение в C #?

1 голос
/ 01 марта 2012

Поскольку вы хотите вызвать исключение, я бы посоветовал вам просто не перехватывать его в методе createTable - вместо этого добавьте обработчик исключений для SqlException iny вашего childDirectoryToolStripMenuItem_Click метода.

private void childDirectoryToolStripMenuItem_Click(object sender, EventArgs e)
{
     try
     {
         SQL.createTable("childDirectory"); //THIS LINE
     }
     catch (SqlException ex)
     {
         MessageBox.Show("Database not created: " + ex.Message);
     }
     catch(SystemException ecp)
     {
         MessageBox.Show(string.Format("An error occurred: {0}", ecp.Message));
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...