如何用do ... catch来捕获NSRangeException?

时间:2015-12-29 12:38:19

标签: 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);
    }
    groups[i] = new StringBuilder (groups[i]).reverse ().toString ();
    groups[i] = get1To3DigitString (groups[i]) + " " + getTheWord (i) + " ";
}

注意:

  • integerPart是一个字符串。
  • groups是一个字符串数组。
  • 请忽略get1To3DigitStringgetTheWord

我的想法和尝试:

由于swift的字符串非常烦人(不能用Int索引),我决定使用NSString&#39; s substringFromIndex和{ {1}}方法来执行substringWithRange Java方法。所以我写了这两个方法来帮助我:

substring

我知道func substring (s: String, start: Int, end: Int) throws -> String{ let ns = NSString(string: s) return String(ns.substringWithRange(NSRange(start..<end))) } func substring (s: String, start: Int) -> String { let ns = NSString(string: s) return String(ns.substringFromIndex(start)) } 中的两个子字符串方法会抛出NSString,就像Java NSRangeException一样。所以这是我的快速代码:

IndexOutOfBoundsException

我得到一个错误,说捕获模式与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) + " " } 不匹配!我认为它确实匹配ErrorType,因为如果它没有,我该如何捕获异常?所以我删除了ErrorType一词。

我认为如果在NSRangeException中抛出异常,我会在substring部分中发现它。但是当我测试它时,catch行发生了异常!我想这是因为我错误地写了捕获模式。

我该如何抓住try

1 个答案:

答案 0 :(得分:0)

就像在Java中一样,你从来没有捕到过IndexOutOfBoundsException你从未在Swift或Objective-C中找到NSRangeException

这些异常是由于您作为开发人员搞砸了,而不是应用程序或某些外部因素,或者是他的输入用户。在Java中,您有已检查的例外未经检查的例外这一术语。第一个你可以而且应该来捕获,第二个在运行时出现并且在程序中发出大部分错误。

你不能将长度为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")
    }
}

apple docs解释说一切都比较好。