2013-10-15 4 views
0

Я хочу, чтобы лучше узнать данные об ошибках базы данных. настоящее время я использую:Сведения об ошибке Catch DB

try 
{ 

    dbconn.table.AddObject(newRow); 
    dbconn.SaveChanges(); 

} 
catch (Exception ex) 
{ 
    Console.WriteLine("DB fail ID:" + Row.id); 
} 

много раз я не нашел Exception ex может не дать мне подробную информацию о том, как исключение произошло.

Я думаю, что это исключение, скорее всего, будет иметь вид соединения с БД.

Так есть лучший способ поймать это?

+1

Проверять ограничения (FKs, ограничения, уникальные ограничения) в приложении, а не уступать их DB. – Alireza

+0

Да. Отобразите ex.ToString(), который покажет вам все, что нужно знать об исключении. –

ответ

1

Вы также должны вывести исключение. В большинстве случаев он содержит полезную и подробную информацию (например, имена нарушенных ограничений). Попробуйте это:

try 
{ 
    dbconn.table.AddObject(newRow); 
    dbconn.SaveChanges(); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine("DB fail ID:" + Row.id); 
    Console.WriteLine(ex.ToString()); 
} 

Для получения подробной информации, используйте метод ToString(), это даст вам трассировки стека, а не только сообщение об ошибке.

+0

Кроме того, ToString() будет рекурсивно проходить внутренние исключения. – Lev

1

Используйте Console.WriteLine(ex.GetType().FullName) (или положите точку останова и запустите под отладчиком), чтобы увидеть, как создается фактический тип исключения. Затем посетите MSDN, чтобы увидеть его описание и базовые классы. Вам нужно решить, какой из базовых классов предоставляет вам информацию, необходимую для раскрытия таких свойств. Затем используйте этот класс в своем выражении catch().

Для платформы Entity Framework вы можете использовать EntityException, а затем проверить свойство InnerException объекта исключения SQL, который он обертывает.

try 
{ 
    dbconn.table.AddObject(newRow); 
    dbconn.SaveChanges(); 
} 
catch (EntityException ex) 
{ 
    Console.WriteLine("DB fail ID:" + Row.id + "; Error: " + ex.Message); 
    var sqlExc = ex.InnerException as SqlException; 
    if (sqlExc != null) 
     Console.WriteLine("SQL error code: " + sqlExc.Number); 
} 
1

Вместо Exception использовать SqlException. SqlException дает вам более подробную информацию. он имеет свойство Number, указывающее тип ошибки, и вы можете использовать это число в случае коммутатора, чтобы предоставить некоторую связанную информацию с пользователем.

0

Короче говоря, да, есть лучший способ справиться с этим. «Как» этого зависит от вас.

Обработка исключений в C# идет от наиболее определенного типа исключения к мере конкретного. Кроме того, вы не ограничены использованием только одного блока catch. У вас может быть много из них.

В качестве примера:

try 
{ 
    // Perform some actions here. 
} 

catch (Exception exc) // This is the most generic exception type. 
{ 
    // Handle your exception here. 
} 

Приведенный выше код является то, что у вас уже есть. Для того, чтобы показать пример того, что вы можете:

try 
{ 
    // Perform some actions here. 
} 

catch (SqlException sqlExc) // This is a more specific exception type. 
{ 
    // Handle your exception here. 
} 

catch (Exception exc) // This is the most generic exception type. 
{ 
    // Handle your exception here. 
} 

В Visual Studio, можно увидеть список (в большинстве) исключений, нажав сочетание клавиш CTRL + ALT + E.

Смежные вопросы