2015-09-11 5 views
1

Я хотел бы спросить, если я получаю правильный синтаксис при использовании попытаться поймать в asp.netпопытаться поймать исключение

Мой код выглядит следующим образом:

public ActionResult Add_RefPerson(rms_referred_person ref_person) 
    { 
     if (ModelState.IsValid) { 
      try 
      { 
       ref_person.rf_referreddate = Date(); 
       ref_person.rf_createdby = getBadge(); 
       ref_person.rf_updatedby = null; 
       ref_person.rf_updateddate = null; 
       ref_person.rf_isactive = true; 
       db.rms_referred_person.Add(ref_person); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      catch (Exception ex) { 
       throw ex; 
      } 
     } 
     return Content("<script type='text/javascript'>alert('Cannot be saved');</script>"); 
    } 

Это моя попытка и поймать в правильном направлении? или я должен использовать этот.

public ActionResult Add_RefPerson(rms_referred_person ref_person) 
    { 

      try 
      { 
        if (ModelState.IsValid) { 
         ref_person.rf_referreddate = Date(); 
         ref_person.rf_createdby = getBadge(); 
         ref_person.rf_updatedby = null; 
         ref_person.rf_updateddate = null; 
         ref_person.rf_isactive = true; 
         db.rms_referred_person.Add(ref_person); 
         db.SaveChanges(); 
         return RedirectToAction("Index"); 
       } 
      } 
      catch (Exception ex) { 
       throw ex; 
      } 

     return Content("<script type='text/javascript'>alert('Cannot be saved');</script>"); 
    } 

Большое спасибо.

+2

использовать 'throw;'., 'throw ex;' уничтожает трассировку стека из исключения. – jdphenix

+2

Пожалуйста, никогда не делайте 'catch (Exception ex)' не говоря уже о 'catch (Exception ex) {throw ex; } '. Первая - плохая практика, а последняя просто ужасна. Вы должны только обрабатывать исключение, которое действительно является исключительным ** и **, из которого вы можете восстановиться. В противном случае допускаются исключения на вершину. Ваш код будет иметь меньше ошибок и будет более удобным, если вы это сделаете. – Enigmativity

+0

Посмотрите, чтобы узнать больше о [Try Catch] (http://stackoverflow.com/a/32394690/3796048) –

ответ

3

Это правильный синтаксис для исключения всех исключений; однако это довольно плохой антипаттерн. Это ловит ex и сразу же бросает его снова, сбивая всю трассировку стека. Если требуется повторное сверление, напишите бросок;

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

+0

Я думаю, что вопрос OP больше связан с размещением try catch. – DarkKnight

+0

Учитывая, что его второе возвращение недостижимо, у него больше развивается, чем он знает. – Joshua

1

Единственное отличие состоит в том, что последний из них будет отлавливать все исключения в строке

if (ModelState.IsValid) 

. Если вы не считаете, что линия может на самом деле , то исключение составляет, они идентичны.


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

Кроме того, Повторное выбрасывание исключение лучше всего делать с throw сама по себе, а не throw ex. Первый сохраняет информацию о том, что последний проиграет.

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

1

2-й вариант безопаснее, так как он покрывает ModelState. Кроме того, throw ex; - отличная идея. вы не получите полную трассировку стека. использование throw;

  try 
      { 
        if (ModelState.IsValid) { 
         ref_person.rf_referreddate = Date(); 
         ref_person.rf_createdby = getBadge(); 
         ref_person.rf_updatedby = null; 
         ref_person.rf_updateddate = null; 
         ref_person.rf_isactive = true; 
         db.rms_referred_person.Add(ref_person); 
         db.SaveChanges(); 
         return RedirectToAction("Index"); 
       } 
      } 
      catch (Exception ex) { 
       throw ex; 
      } 
Смежные вопросы