Java 如何使用do…catch捕获nsrange异常?

Java 如何使用do…catch捕获nsrange异常?,java,swift,exception,exception-handling,Java,Swift,Exception,Exception Handling,我正在将此Java代码翻译为swift: for (int i = 0 ; i < groups.length ; i++) { try { groups[i] = integerPart.substring (i * 3, i * 3 + 3); } catch (IndexOutOfBoundsException ex) { groups[i] = integerPart.substring (i * 3); } grou

我正在将此Java代码翻译为swift:

for (int i = 0 ; i < groups.length ; i++) {
    try {
        groups[i] = integerPart.substring (i * 3, i * 3 + 3);
    } catch (IndexOutOfBoundsException ex) {
        groups[i] = integerPart.substring (i * 3);
    }
    groups[i] = new StringBuilder (groups[i]).reverse ().toString ();
    groups[i] = get1To3DigitString (groups[i]) + " " + getTheWord (i) + " ";
}
我知道
NSString
中的两个子字符串方法会抛出一个
NSRangeException
,就像Java的
IndexOutOfBoundsException
一样。这是我的swift代码:

for var i = 0 ; i < groups.count ; i++ {
    do {
        try groups[i] = substring(integerPart, start: i * 3, end: i * 3 + 3)
    } catch NSRangeException {
        groups[i] = substring(integerPart, start: i * 3)
    }
    groups[i] = String (groups[i].characters.reverse())
    groups[i] = get1To3DigitString (groups[i]) + " " + getTheWord (i) + " "
}
var i=0的
;i<组数;i++{
做{
try groups[i]=子字符串(整数部分,开始:i*3,结束:i*3+3)
}捕获异常{
组[i]=子字符串(整数部分,开始:i*3)
}
groups[i]=字符串(groups[i].characters.reverse())
组[i]=get1To3DigitString(组[i])+“”+getTheWord(i)+“”
}
我得到一个错误,说捕获模式不匹配
ErrorType
!我认为它确实匹配
ErrorType
,因为如果不匹配,我该如何捕获异常?因此,我删除了单词
NSRangeException

我想如果在
子字符串中抛出异常,我会在
catch
部分捕获它。但是当我测试它时,
try
行出现异常!我想这是因为我写的捕获模式不正确


我应该如何捕捉
NSRangeException

就像在
Java
中一样,您永远不会捕捉到
indexoutboundsexception
您永远不会在Swift或Objective-C中捕捉到
NSRangeException

导致这些异常的原因是您作为开发人员搞砸了,而不是应用程序或某些外部因素,或者用户的输入。在
Java
中,有术语checked exceptions和unchecked exceptions。第一个是您可以而且应该或者甚至要捕获的,第二个是在运行时发生的,主要是程序中的错误

在长度为5的字符串的第十个字符之前,您不能将其作为子字符串,这是作为开发人员您可以而且必须知道的。如果执行此操作,程序将崩溃

我不确定您是否真的可以捕获
NSRangeException
——如果您不能捕获,我将非常高兴。对于常规错误,可以定义自定义错误类型:

enum LevelParsingException : ErrorType {
    case MalformedJson
    case InvalidLevelContent
}
然后你有一些函数可能会抛出它们:

func parseLevel() throws {
    guard someCondition {
        throw LevelParsingException.InvalidLevelContent
    }
}
然后调用该方法并捕获可能出现的所有不同错误:

func call() {
    do {
        try parseLevel()
    } catch LevelParsingException.InvalidLevelContent {
        print("something")
    } catch  {
        print("something else")
    }
}

这一点可以解释得很好。

就像在
Java
中一样,在Swift或Objective-C中,您永远不会捕捉到
索引自动边界异常

导致这些异常的原因是您作为开发人员搞砸了,而不是应用程序或某些外部因素,或者用户的输入。在
Java
中,有术语checked exceptions和unchecked exceptions。第一个是您可以而且应该或者甚至要捕获的,第二个是在运行时发生的,主要是程序中的错误

在长度为5的字符串的第十个字符之前,您不能将其作为子字符串,这是作为开发人员您可以而且必须知道的。如果执行此操作,程序将崩溃

我不确定您是否真的可以捕获
NSRangeException
——如果您不能捕获,我将非常高兴。对于常规错误,可以定义自定义错误类型:

enum LevelParsingException : ErrorType {
    case MalformedJson
    case InvalidLevelContent
}
然后你有一些函数可能会抛出它们:

func parseLevel() throws {
    guard someCondition {
        throw LevelParsingException.InvalidLevelContent
    }
}
然后调用该方法并捕获可能出现的所有不同错误:

func call() {
    do {
        try parseLevel()
    } catch LevelParsingException.InvalidLevelContent {
        print("something")
    } catch  {
        print("something else")
    }
}

我知道NSString中的两个子字符串方法会抛出一个NSRangeException,是吗?Swifts
try/catch
用于使用
throw
抛出的Swift错误。这与运行时错误或NSException完全无关,您无法在Swift中捕获它们。我对其进行了测试。他们真的做到了!我尝试了
substring(“Hello”,start:1,end:10)
@luk2302,我知道NSString中的两个substring方法会抛出NSRangeException-是吗?Swifts
try/catch
用于使用
throw
抛出的Swift错误。这与运行时错误或NSException完全无关,您无法在Swift中捕获它们。我对其进行了测试。他们真的做到了!我尝试了
子字符串(“您好”,开始:1,结束:10)
@luk2302您的意思是我应该首先检查
子字符串的参数是否在范围内,然后调用它?@Sweeper Yes,要么检查它,要么确保作为开发人员的您没有以错误的方式使用该方法。我认为您应该回答最初的问题,而不是说我们搞砸了:)如果UIKit抛出此异常,我必须处理它怎么办?removeObserver方法抛出此(KVO),我无法检查我的对象是否仍注册到该属性。@batu如果抛出异常,则说明您“搞砸了”/引入了一个错误,因为您错过了注销以前注册的对象。如果您从正确的代码开始,就没有必要捕获这些异常-只有在您没有正确检查边缘情况或错过一些调用时才会抛出这些异常。没有必要检查您的对象是否仍在注册-如果您注册了一次,则必须注销一次。您知道,UIPageViewController存在错误。对于某些“边缘”情况,它不会调用其子视图控制器的ViewDidDemouse方法。我通常在那里注销。但我需要处理那些“边缘”案件。我看你对自己很自信,但我觉得这有点过分了。你非但没有给出解决办法,反而坚持说我搞砸了。虫子会发生,有时你需要一个安全网。这就是编程的现实。你的意思是我应该首先检查
子字符串的参数是否在范围内,然后调用它?@Sweeper Yes,要么检查它,要么简单地确保作为开发人员的您没有以错误的方式使用该方法。我认为您应该回答最初的问题,而不是说我们搞砸了:)如果UIKit抛出此异常,而我