2015-10-04 2 views
0

У меня есть простой сущности вставки следующим образом:Почему некоторые исключения находятся на нескольких уровнях?

using (var db = new MyContext()) 
{ 
    var item = new Artist(); 
    TryUpdateModel(item); 
    if (ModelState.IsValid) 
    { 
     db.Artist.Add(item); 
     try 
     { 
      db.SaveChanges(); 
      gvArtist.DataBind(); 
      gvArtist.Visible = true; 
     } 
     catch (Exception e) 
     { 
      Master.Warning = e.InnerException.InnerException.Message; 
     } 
    } 
} 

e.Message и e.InnerException.Message как приравнять:

«Произошла ошибка при обновлении записей См внутреннее исключение для деталей. «.

Но, e.InnerException.InnerException.Message дает исключение я ищу, который:

«Нарушение UNIQUE KEY ограничение„UQ_artist_Cuid“Невозможно вставить повторяющийся ключ в объект„dbo.artist“. . Значение дублирующегося ключа равно (11). Заявление прекращено ».

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

Master.Warning = e.InnerException.InnerException.Message; 

в игре.

ответ

2

Ваши опасения полностью основаны. Что-то вроде этого - то, что вы ищете.

catch (Exception ex) 
{ 
    while (ex.InnerException != null) 
    { 
     ex = ex.InnerException; 
    } 

    Master.Message = ex.Message; 
} 

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

+1

После выхода из цикла 'while'' ex' будет null, поэтому 'ex.Message' будет вызывать' NullReferenceException'. – Hopeless

+1

Спасибо. Я был в нескольких секундах от ложиться спать и не понимал этого. – krillgar

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