Ios Swift 2.0异常处理
我们想知道SWIFT中整个代码块的错误处理机制 在swift中,有一些用于错误处理的技术,其中一些类似于使用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语句,或者编写一
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”完全相同。请查看他对“颌骨骨折”的回复-