使用NSEXPRESSION时正确捕获NsinvalidargumentException的正确方法



我想验证用户创建的表达式(例如" 2 2"," 5 7"或更复杂(。我使用nsexpression类来解析和计算此表达式。这是我的游乐场代码:

import UIKit
let string = "2+2"
var ex:NSExpression?
do {
    ex = NSExpression(format: string)
}
catch {
    print("String is not valid expression")
}
if let result = ex?.expressionValue(with: nil, context: nil) as! NSNumber? {
    print("result is (result)")
}

当我使用有效的表达式(" 2 2"(时 - 我得到结果。但是有时用户可以提供错误的字符串(例如" 2 "(。使用此字符串,我的应用程序崩溃了:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "2+ == 1"'

我不明白如何捕获此例外以及为什么上述代码不这样做。现在,我使用Objective C类(具有相同逻辑(,从我的Swift代码中调用此方法,在该类中,我确实可以捕获这样的例外:

+(NSNumber *)solveExpression:(NSString *)string
{
    id value;
    @try {
        NSExpression *ex = [NSExpression expressionWithFormat:string];
        value = [ex expressionValueWithObject:nil context:nil];
    }
    @catch (NSException *e) { }
    return value;
}

这起作用,我可以得到正确的解析状态(nil表示表达问题(和结果(nsnumber(,但我真的很想了解如何正确地完成所有这些事情。

这是使用Cocoa和Objective-C 使用Swift的书必须说:

尽管快速错误处理类似于Objective-C中的异常处理,但它是完全独立的功能。如果Objective-C方法在运行时抛出异常,Swift会触发运行时错误。无法直接在Swift中直接从Objective-C例外恢复。必须在Swift使用的Objective-C代码中实现任何异常处理行为。

[我的粗体]

刚刚浏览了NSExpression的参考,我看不到问题的简单方法。上面的报价建议编写一些Objective-C代码来完成此操作。最简单的方法可能是创建C函数:

声明:

extern NSExpression* _Nullable makeExpression(NSString* format _Nonnull);

定义

NSExpression* _Nullable makeExpression(NSString* format _Nonnull)
{
    NSExpression* ret = nil;
    @try 
    {
        // create and assign the expression to ret
    }
    @catch(NSException* e)
    {
        // ignore
    }
    return ret;
}

函数返回零误差的表达式。

当发生故障时,您可能可以添加一个NSError**参数。您也可以将此方法当作NSExpression上的类别中的方法,然后返回nil for错误/填充nserror模式可能会以迅速投掷方法的形式导入Swift。

顺便说一句,我应该说,目标-C例外情况并不能真正保证使您的程序处于一致的状态。手指交叉在这种情况下还可以。

NSInvalidArgumentException在Java异常方面不是可捕获的错误。苹果不能保证当您抓住此例外时,您的程序会处于正确状态,并且很可能会出现问题。

您可能应该使用其他一些机制来检查字符串是否有效,然后再将其传递给方法。

相关内容

  • 没有找到相关文章

最新更新