3

私のコードでは、文字列を数式として評価しています。たとえば、次のようになります。

NSString *formula=@"9*7";
NSExpression *expr =[NSExpression expressionWithFormat:formula];
NSLog(@"%@", [[expr expressionValueWithObject:nil context:nil]intValue]);

上記は正常に機能しますが、ユーザーからの動的入力を処理するため、ユーザーが誤ったデータを入力したときに例外をキャッチできる必要があるため、次のような状況で例外をキャッチできる必要があります。

NSString *formula=@"9*"; //note the deliberately invalid expression
NSExpression *expr =[NSExpression expressionWithFormat:formula];
@try {        
    [[expr expressionValueWithObject:nil context:nil]intValue];
}
@catch (NSException *exception) {
    NSLog(@"Exception");
}
@finally {
    NSLog(@"Finally");
}

ただし、このコードを実行すると、次のようになります。

キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: 'フォーマット文字列 "9* == 1" を解析できません''

この例外をキャッチする方法はありますか? または、代わりに、式を渡す前に式が有効かどうかをテストする方法はありますか?

ありがとう!

4

2 に答える 2

8

この例外が現在のコードでキャッチされない理由は、次の行から例外がスローされているためです。

NSExpression *expr =[NSExpression expressionWithFormat:formula];

この行を@tryブロックに移動する必要があります。

于 2013-08-24T17:48:08.403 に答える
0

必要なのは数学パーサーです。NSExpression整形式の入力を受け取るように設計されており、エラーを処理しません。簡単なGoogleはこれを提供ます。

于 2013-06-25T01:26:50.527 に答える