Ios 尝试捕捉错误目标C

Ios 尝试捕捉错误目标C,ios,objective-c,error-handling,try-catch-finally,Ios,Objective C,Error Handling,Try Catch Finally,我试图从instagram图片中获取标题,但是如果没有标题,应用程序会抛出异常并崩溃。我将如何实现@try和@catch来实现这一点。以下是我到目前为止的情况: @try { RNBlurModalView *modal = [[RNBlurModalView alloc] initWithViewController:self title:[NSString stringWithFormat:@"%@",entry[@"user"][@"full_name"]] message:[NS

我试图从instagram图片中获取标题,但是如果没有标题,应用程序会抛出异常并崩溃。我将如何实现
@try
@catch
来实现这一点。以下是我到目前为止的情况:

@try {
    RNBlurModalView *modal = [[RNBlurModalView alloc] initWithViewController:self title:[NSString stringWithFormat:@"%@",entry[@"user"][@"full_name"]] message:[NSString stringWithFormat:@"%@",text[@"caption"][@"text"]]];
    [modal show];
}
@catch (NSException *exception) {
    NSLog(@"Exception:%@",exception);
}
@finally {
  //Display Alternative
}

这不是异常和
try
-
catch
-
finally
块的好用法。如果标题为
nil
,则表示得到异常。那么,为了优雅地处理这种情况,您希望您的应用程序做些什么呢?根本不显示对话框?然后你可以做一些类似的事情:

NSString *user = entry[@"user"][@"full_name"];
NSString *caption = text[@"caption"][@"text"];

if (caption != nil && caption != [NSNull null] && user != nil && user != [NSNull null]) {
    RNBlurModalView *modal = [[RNBlurModalView alloc] initWithViewController:self title:user message:caption];
    [modal show];
}
或者,如果它们是
nil
,您可能希望显示其他内容:

NSString *user = entry[@"user"][@"full_name"];
NSString *caption = text[@"caption"][@"text"];

if (caption == nil || caption == [NSNull null])
    caption = @"";     // or you might have @"(no caption)" ... whatever you want
if (user == nil || user == [NSNull null])
    user = @"";

RNBlurModalView *modal = [[RNBlurModalView alloc] initWithViewController:self title:user message:caption];
[modal show];
或者,如果您有
RNBlurModalView
的源代码,您可能可以准确地诊断为什么当标题为
nil
时它会生成异常,并在那里解决该问题

有很多可能的方法,具体取决于您希望应用程序在这些情况下做什么,但异常处理无疑不是正确的方法。作为《使用Objective-C编程指南》的一节,异常适用于意外的“程序员错误”,而不是简单的逻辑错误,正如他们所说:

您不应该使用try-catch块来代替Objective-C方法的标准编程检查


您是否尝试了[exception reason]而不是NSLog语句中的exception。我真的不知道如何才能告诉我如何操作?我想您也在抛出异常?在Objective-C中,不鼓励在这种常见情况下使用异常。异常适用于……嗯……程序无法恢复的异常情况。相反,为什么不使用
NSError
对象并在没有标题时向用户发出信号。请尝试
NSLog(@“Exception%@,[Exception reason])
@Borrden你能给我举个例子吗我是一个新手它在这里不起作用是什么来的
libc++abi.dylib:terminate调用抛出一个异常
2013-08-06 23:52:32.878 Floadt[2589:c07]-[NSNull objectForKeyedSubscript:]:无法识别的选择器发送到实例0x3102678 2013-08-06 23:52:32.880 Floadt[2589:c07]***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[NSNull objectForKeyedSubscript:]:发送到实例0x3102678的无法识别的选择器'libc++abi.dylib:terminate调用引发异常
@prnk28您的错误告诉您该对象是
[NSNull]
。因此,也只需添加检查。请参阅修订后的答案。我假设错误来自标题
[NSNull null]
,因此此编辑应完成此操作。否则,您必须准确确定将哪个对象设置为
[NSNull null]
。它仍然会给我同样的错误。@prnk28更仔细地观察错误,它是
objectforkeydsubscript
(在使用
[]
语法时调用)。因此,
entry
[NSNull null]
文本是
[NSNull]
entry[@“user”
[NSNull]
文本[@“caption”]
[NSNull null]
。您必须检查这些值,并找出哪个值给出了
[NSNull null]
值。