2016-01-20 46 views
1

我們希望知道SWIFT中的錯誤處理機制以完成整個代碼塊。Swift 2.0異常處理

因爲,在迅速,有一些技術用於錯誤處理,其中一些像使用guardif let。我們也可以使用do - catch聲明來實現它。但是我們在處理整個代碼時使用單個try-catch塊處理錯誤時卡住了,正如我們在Objective-C中所做的那樣。在Objective-C這個塊很容易處理任何代碼行內的錯誤。所以我們想要快速瞭解這種機制。

現在,我們才知道,如果我們需要處理錯誤,然後用guardif-let聲明每一行,或寫這將引發錯誤,並使用該方法在do-catch塊的一些自定義的方法。那麼Swift中有沒有什麼機制可以像Objective-C那樣平行於try-catch塊,所以我們不需要爲整個代碼中的每一行代碼編寫if-letguard語句。

這是我們如何使用if-letguard讓單行聲明空處理:

if-let實施示例代碼段: -

if let title = dict["title"].string 
{ 
    let myTitle = title 
} 

但低於提到的場景中,我們希望迅速解決代理函數中的try-catch塊。

try-catch使用塊

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 

    @try { 
     static NSString *itemIdentifier = @"CustomCell"; 
     //Some line of code where exception may occur… 
     //Some line of code where exception may occur… 
     //Some line of code where exception may occur… 
     //Some line of code where exception may occur… 
     //… 
     //… 
     //… 
     return cell; 
    } 
    @catch (NSException *exception) { 
     NSLog(@"Exception in cellForItemAtIndexPath - %@「,exception.description); 
    } 
} 

上面Objective-C甲示例代碼段是我們使用在Objective-C的代碼片段。但是現在我們想在Swift中使用try-catch。但直到現在我們還沒有找到任何解決方案。那麼,我們如何處理這種情況,我們可以將try-catch塊添加到委託表視圖,集合視圖等功能中。

+0

看到這個:http://iosdevcenters.blogspot.in/2015/12/error-handling-in-swift-20.html –

+0

@KiritModi - 請再讀一遍我的問題...我想單一的嘗試趕上塊爲線束..我不想把每條線的if-let或gaurd ... – Nayan

+0

我的情況是完全一樣的像「hpux735」。請查看他對「jawbroken」的回覆 - https://forums.developer.apple.com/message/10227#10227 – Nayan

回答

1

正如@JeremyP所說,在swift中沒有例外。爲了清楚起見,您可以使用單個do-catch塊捕獲多個錯誤,但必須使用if-letguard來避免不可捕捉的致命錯誤。例如:

do { 
    try method1() 
    try method2() 
} catch { 
    // do something with the error 
} 

,但前面的例子不會處理一個致命的錯誤,例如:

do { 
    try method1() 
    let myVar = anOptionalVar! 
} catch { 

} 

這個代碼將無法處理一個致命的錯誤,如果anOptionalVar是nil和你強迫展開它會導致致命錯誤,從而終止執行。

因此,通過@JeremyP描述的模式應該被用來處理錯誤:

enum myError: ErrorType { 
    case BadError 
} 

do { 
    guard let myVar = anOptionalVar else { throw MyError.BadError } 
} catch MyError.BadError { 
    // do something with the error 
} 

那麼作爲SWIFT 2的周圍有使用guardif-let遠離致命錯誤安全沒辦法,只能選擇使用它們並傳播ErrorType

1

在Swift中,沒有例外。在Objective-C中,有例外,但除了程序終止問題之外,您不應該真正使用它們。原因是如果一個方法調用其他引發異常的方法,並且它不處理異常本身,它肯定會泄漏資源(內存,文件描述符等)。

在Swift中,你可以拋出一個錯誤,但這在概念上是NSError**模式的語法糖。你可以拋出符合ErrorType協議的任何東西,但我認爲你只能在枚舉上添加它。話雖如此,NSError符合ErrorType,所以你可以拋出NSError

你可以聲明在使用這樣的函數拋出這樣的錯誤

enum MyError: ErrorType // Protocol for all errors that can be thrown 
{ 
    case ReallyBad 
    case NotSoBad 
} 

func aFuncThatThrows(foo: Int) throws -> Int 
{ 
    guard foo >= 0 else { throw MyError.NotSoBad } 
    // Other stuff 
} 

的功能,你必須嘗試這樣,來電者知道,錯誤可以扔掉它標記。

let bar = try aFuncThatThrows(-1) 

你在任何有通過與throws關鍵字被宣佈重新拋出的錯誤,或必須處理它與do { ... } catch建設做錯誤的功能。

do 
{ 
    let bar = try aFuncThatThrows(-1) 
} 
catch 
{ 
    // handle errors 
} 

如果需要,可以有多個處理不同類型錯誤的catch塊。例如

catch MyError.ReallBad 
{ 
    // Handle really bad errors 
} 
catch MyError.NotSoBad 
{ 
    // handle not so bad errors 
} 
catch 
{ 
    // Handle anything else - catches must be exhaustive. 
}