2016-11-05 3 views
-1

Я пытаюсь получить мою голову вокруг использования ошибок в стриже, например, у меня есть этот код:Какая польза от ошибок, бросков и улов?

import UIKit 

class ViewController: UIViewController { 

    enum SomeError: Error 
    { 
     case badWord 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     do { 
      try checkWord() 
     } 
     catch SomeError.badWord { 
      print("error!") 
     } 
     catch { //This is like a defualt statement 
      print("Something weird happened") 
     } 

    } 

    func checkWord() throws { 
     let word = "crap" 
     guard word != "crap" else { 
      throw SomeError.badWord 
     } 
     print("Continuing the function") 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 

checkWord функция прекращается, если слово это плохо. Однако такое же поведение может быть достигнуто с помощью:

func checkWord() { 
    let word = "crap" 
    guard word != "crap" else { 
    print("error!") 
    return 

    } 
    print("Continuing the function") 
} 

Так в чем же заключается использование определения ошибок и прохождения выписок?

+1

Пособие находится на том месте, где вы вызываете функцию. Хорошим примером является библиотека 'JSONSerialization'. Если вы передадите данные, недопустимые JSON, это приведет к ошибке. В Objective-C вы должны передать указатель ошибки методу, а затем проверить его на наличие ошибки. В Swift метод возвращает правильный результат или генерирует ошибку при сбое. – daltonclaybrook

+0

Вы также считаете, что 'checkWord' может выйти из строя только по одной причине. Часто у вас может быть множество причин, по которым могла быть выбрана ошибка, и, как сказал Мартин, вызывающая процедура может захотеть предпринять разные действия, основанные на типе ошибки. См. [Язык быстрого программирования: обработка ошибок] (https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html#//apple_ref/doc/uid/TP40014097-CH42 -ID508) для более богатого примера. – Rob

ответ

2

Со второй реализацией checkWord вызывающий абонент checkWord не имеет возможности узнать результат проверки.

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

Например, ваша задача checkWord - проверить наличие плохих слов. Но он не должен делать никаких предположений о том, что должно быть сделано, когда будет найдено плохое слово. checkWord может быть вызван из разных мест даже в разных приложениях (если вы сделали его доступным в рамках, например). Таким образом, ваша функция checkWord должна выполнить свою проверку и, при необходимости, выбросить ошибку. Позвольте вызывающему абоненту checkWord решить, как лучше всего справиться с ошибкой. Он может решить показать сообщение пользователю. Он может решить просто записать его и продолжить. Дело в том, checkWord не должно волновать. Позвольте собеседнику решить, что лучше.

+0

Спасибо за подробный ответ! Это позволяет другим функциям вашего кода определять, как обрабатывается ошибка, и это не ограничивается реализацией в его методе. Я думаю, это также полезно для написания фреймворков, в которых пользователь не может редактировать исходный код, но вы все же хотите дать им возможность справиться с ошибкой. – KexAri

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