2016-02-11 3 views
0

Я пытаюсь поймать конкретный SqlException 515 (Не могу вставить значение NULL в столбец), и я не могу предварительно проверить значение до фактического INSERT. Я могу только зафиксировать ошибку и определить, какая она была.Вызвать метод sqlexception для вызова, который использует регулярное исключение?

В следующем исполнении alert() может отображать эти сообщения: есть где-то пустое значение (от SqlException 515) или общая ошибка, заявляющая, что что-то не так.

В этом случае я знаю, что могу создать и выбросить пользовательскую ошибку исключения, но я хотел бы использовать только то, что у меня есть здесь, поскольку SqlException будет фиксировать точную ошибку.

Кроме того, эти два метода находятся в двух разных классах, и я хочу включить только System.Data.SqlClient, где используется метод Insert().

Наконец, я могу использовать обычный System.Exception с помощью метода substring и поиска конкретной строки. Но должен быть лучший способ.

Так вот мой псевдокод:

public void InsertNewCar() 
{ 
    try 
    { 
     Car myCar = new Car(); 
     myCar.Insert(); 
    } 
    catch (Exception ex) 
    { 
     alert(msg); //Alerts the user: "Something missing" or "generic error" 
    } 
} 

public void Insert() 
{ 
    try 
    { 
     SqlHelper.ExecuteNonQuery(ConnString, CommandType.Text, sqlInsert); 
    } 
    catch (SqlException ex) 
    { 
     if (ex.Number == 515) 
     { 
      //throw exception specifying that something's missing in the INSERT 
     } 
     else 
     { 
      throw ex; //throw ex that will be interpreted as a generic error. 
     } 
    } 
} 

Мой вопрос: когда я захвачу SqlException 515, что я могу с ним делать? Как только я его брошу, я не могу проверить номер ошибки в пределах InsertNewCar().

Я могу иметь Insert() вернуть значение, но тогда Исключение не будет выбрано. И я не хочу использовать ключевое слово ref.

Спасибо.

+1

«Как только я бросаю его, я не могу проверить номер ошибки в InsertNewCar()» - вы можете, если вы поймаете 'SqlException' в' InsertNewCar' ... Или вы можете использовать другой вид исключения и catch *, который * в 'InsertNewCar'. –

+0

Но все sql-связанные находятся в классе, где находится Insert(). Я просто не хотел добавлять пространство имен 'System.Data.SqlClient' именно для этого. Но я думаю, это можно сделать так. – rbhat

+0

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

ответ

2

Вы можете повторно выдать его с конкретными, другими исключениями:

throw new SomethingMissingException("Some guiding text", ex /*the original exception*/); 

Таким образом, вы можете справиться с этим где-то в более общем виде. Кроме того, не забудьте добавить исходное исключение в исключение, которое вы бросаете. Это может пригодиться некоторое время.

+0

Я также рассматривал, что , но я использую 'System.Exception' и' SqlClient.SqlException', поэтому я думал, что этих двух будет достаточно. – rbhat

+0

Ну, если вы не хотите обрабатывать 'SqlException' в' InsertNewCar', вам нужно сделать что-то. И работа с кодами сообщений - это не то, что вы хотите ... –