2013-01-11 2 views
0

Использование:стандарты программирования и рефакторинга попробовать/поймать заявление

node.js

Проблема:

Хотя рефакторинга мой код сегодня я видел эти куски линий. Интересная вещь о них заключается в том, что каждая альтернативная линия в try catch может вызывать и исключение, и, следовательно, код может вылетать. Для какой практики я следую, каждое отдельное исключение должно обрабатываться конкретно, а минимальные (полезные) строки кода должны быть в try catch. Как программист, с каким подходом я должен следовать (A, B, anyother)? И почему? Я лично поеду с A, так как это уменьшит количество строк в коде.

Код A:

function(err, someData, res){ 
    if(err){ 
     console.error(err); 
    } else{ 

     try{ 
      data = JSON.parse(someData); //exception expected 

      if(someVariable == "abc"){ 
       var items = data['a']; //exception expected 
      } else if(site == "xyz"){ 
       var items = data['b']; //exception expected 
      } 

     } catch(err){ 
      console.error(err); 
     } 
} 

Код B:

function(err, someData, res){ 
    if(err){ 
     console.error(err); 
    } else{ 

     try{ 
      data = JSON.parse(someData); //exception expected 
     } catch(err){ 
      console.error(err); 
     } 

     if(someVariable == "abc"){ 
      try{ 
       var items = data['a']; //exception expected 
      } catch(err){ 
       console.error(err); 
      } 
     } else if(site == "xyz"){ 
      try{ 
       var items = data['b']; //exception expected 
      } catch(err){ 
       console.error(err); 
     } 
      } 
} 

ответ

1

А хорошо.

B плохо, потому что, скажем, вы ошиблись при разборе json, он продолжит работу с остальной частью кода, даже если вы знаете, что это невозможно. Хуже все еще, когда добавляется еще один код, который может действительно иметь действительно странные побочные эффекты или трудно отследить ошибки. Также очень сложно читать.

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

1

Я не думаю, что использование многих блоков try-catch (B) - по одному для каждой строки исходного кода - имеет какое-либо преимущество. Используйте один блок try-catch (A) для каждой семантически определенной части кода, как правило, одного или кодового блока, который должен выполняться атомарно - он должен быть успешным или неудачным в целом.

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

try 
{ 
    // ... 
} 
catch(e) 
{ 
    if(e instanceof SpecificError) 
    { 
    // 
    } 
} 

Также возможно проанализировать e.message.

1

А с твистом

В "Clean Code", «Дядя Боб» Мартин считает, что попробовать/перехват исключений является конкретной задачей, достойной своей собственной функции. Извлеките реальную работу в отдельный метод. Это глупое предложение заставило меня рассказать сначала, но мне понравилась идея.

parseData = function(someData, res) { 
    data = JSON.parse(someData); //exception expected 

    if(someVariable == "abc"){ 
     var items = data['a']; //exception expected 
    } else if(site == "xyz"){ 
     var items = data['b']; //exception expected 
    } 
} 

tryParseData = function(err, someData, res){ 
    if(err) { 
     console.error(err); 
    } else { 
     try { 
      parseData(someData, res); 
     } catch(err) { 
      console.error(err); 
     } 
    } 
} 
Смежные вопросы