Ios Swift 2.0异常处理

Ios Swift 2.0异常处理,ios,error-handling,exception-handling,swift2,try-catch,Ios,Error Handling,Exception Handling,Swift2,Try Catch,我们想知道SWIFT中整个代码块的错误处理机制 在swift中,有一些用于错误处理的技术,其中一些类似于使用guard或if let。我们还可以使用do-catch语句来实现它。但是,我们在处理整组代码的错误时遇到了麻烦,就像我们在Objective-C中所做的那样,我们使用单次try-catch块。在Objective-C中,此块可以轻松处理其中任何代码行中的错误。所以我们想知道swift中的这种机制 现在,我们知道如果我们需要处理错误,那么对每一行使用guard、if let语句,或者编写一

我们想知道SWIFT中整个代码块的错误处理机制

在swift中,有一些用于错误处理的技术,其中一些类似于使用
guard
if let
。我们还可以使用
do-catch
语句来实现它。但是,我们在处理整组代码的错误时遇到了麻烦,就像我们在
Objective-C
中所做的那样,我们使用单次try-catch块。在
Objective-C
中,此块可以轻松处理其中任何代码行中的错误。所以我们想知道swift中的这种机制

现在,我们知道如果我们需要处理错误,那么对每一行使用
guard
if let
语句,或者编写一些自定义方法抛出错误并在
do catch
块中使用该方法。因此,Swift中是否有类似于
Objective-C
中的
try-catch
块的机制,这样我们就不需要为整组代码中的每一行代码编写
如果let
guard
语句

这就是我们如何使用
if let
guard
let进行单行语句空处理的方法:

if let
实现示例代码片段:-

if let title = dict["title"].string
{
   let myTitle = title
}
但下面提到的场景中,我们希望在swift中为委托函数中的
try-catch
块提供解决方案

使用
try-catch
块在
Objective-C
中创建一个示例代码段

- (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
中使用的代码片段。但现在我们想在Swift中使用相同的
try catch
。但到目前为止,我们还没有找到任何解决办法。那么,我们如何处理这样的场景,即我们可以添加
try-catch
块来委托表视图、集合视图等函数,等等。

在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
}
当您使用这样的函数时,必须用try标记它,以便调用方知道可能会抛出错误

let bar = try aFuncThatThrows(-1)
您所在的函数要么必须通过使用
throws
关键字声明来重新显示错误,要么必须处理它在
do{…}catch
构造中所做的错误

do
{
    let bar = try aFuncThatThrows(-1)
}
catch
{
    // handle errors
}
如果需要,可以有多个catch块来处理不同类型的错误。e、 g

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

正如@JeremyP所说,在swift中没有例外。为了明确这一点,您可以使用单个
do catch
块来捕获多个错误,但是必须使用
if let
guard
来避免无法捕获的致命错误。例如:

do {
  try method1()
  try method2()
} catch {
  // do something with the error 
}
do {
  try method1()
  let myVar = anOptionalVar!
} catch {

}
但前面的示例不会处理致命错误,例如:

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开始,没有办法使用
guard
如果让
避免致命错误,您唯一的选择就是使用它们并传播
ErrorType

@KiritModi-请再次阅读我的问题。。。我想要一组线的单尝试捕捉块。。我不想把如果让或高尔德为每一行…我的条件是像“hpux735”完全相同。请查看他对“颌骨骨折”的回复-