2015-07-10 4 views
6

Я пытаюсь использовать Swift 2.0 try-catch.swift может уловить фатальную ошибку?

Первоначально я имел следующий код

override func viewDidLoad() 
{ 
    var obj : Object?; 
    Hi(obj); 
} 

Но procdues ошибку

func Hi(open : Open?) -> Open? 
{ 
    open!.Hi(); <-- here is error point. Fatal error ! 
    print("OK"); 

    return open; 
} 

Поэтому я изменил код в viewDidLoad() для:

override func viewDidLoad() 
{ 
    try 
    { 
     var obj : Object?; 
     Hi(obj); 
    } 
    catch 
    { 
     print("bug !!!"); <- I want to this !!! 
    } 
} 

Но это делает не работа !!!

Я думаю, что попытка try switch отличается от C, C#.

Как я могу уловить фатальную ошибку?

Может ли следующее быть правильным быстрым способом?

func Hi(open : Open?) -> Open? 
{ 
    if let op = open 
    { 
     op.Hi(); 
     print("OK"); 

     return open; 
    } 
    else 
    { 
     return nil; 
    } 
} 
+2

Просто прочитайте все это: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html –

ответ

0

Когда вы звоните Hi() так: open!.Hi();, ваша программа может привести к сбою, если open равна нулю.

open - это параметр, и значение, которое передается как этот параметр, определено на сайте вызова как таковое: var obj : Object?;. Вы определяете новую переменную с именем obj с типом Object?, но вы не присваиваете ей значение. Это означает, что obj будет равен нулю, и поэтому open будет nil, и это приведет к ошибке open!.Hi().

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

9

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

Что-то, связанное с ключевыми словами try, catch и throw, доступно в Swift 2, но это не что иное, как исключения C++, о которых вы, похоже, думаете.

+1

Это такой позор! Спасибо, ваш ответ ^^ a – AquaMinDlRae

+0

«Ничего подобного исключений C++»? Я ... сделаю исключение. Это почти такая же идея, не так ли? –

+4

«Вы не уловили ошибки программирования, вы исправляете свой код». ужасно, приложения в дикой природе, у 1000 пользователей есть много перестановок кода и данных, которые вы не могли предвидеть и протестировали все заблаговременно. На данный момент мы должны использовать Objective-C, чтобы вы могли перехватывать исключения, регистрировать их и допускать изящество изящно, а не просто сбой, как приложение Swift. –

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