1

我正在开发一些 API(Crittercism)来向服务器报告客户端中处理的异常。

客户端 API 将NSException作为输入参数。在调用 API 之前, 我还必须添加一些应用程序上下文信息 string( NSString) 。NSException

我如何使用 Objective-C 来做到这一点。

NSString* appContextString;


NSString *test = @"test";
unichar a;
int index = 5;

@try {
    a = [test characterAtIndex:index];
}
@catch (NSException *exception) {
    // add app context to exception before reporting to Crittercism.
    [Crittercism logHandledException:exception]; 
}

我必须将 appContextString 附加到异常。

4

2 回答 2

1

您可以从旧对象的属性构建一个新NSException对象,但这看起来很混乱。由于您只是记录已处理的异常,因此我将在此之前简单地记录“应用程序上下文”:

@try {
    a = [test characterAtIndex:index];
}
@catch (NSException *exception) {
    NSString *appContext = @"...";
    [Crittercism leaveBreadcrumb:appContext];
    [Crittercism logHandledException:exception]; 
}
于 2015-05-19T07:10:10.963 回答
1

你必须复制它。这很容易做到。的实例NSExeption具有三个重要属性:

  • 姓名
  • 原因
  • 用户信息

复制时,您可以在用户信息字典中添加一个字符串:

NSMutableDictionary *userInfo = [exception.userInfo mutableCopy];
userInfo[@"YourPrivateKey"] = contextString;
NSException *extendedException = [NSException exceptionWithName:exception.name reason:exception.reason userInfo:userInfo];

我认为需要注意的是,您将丢失调用堆栈。您也可以阅读它并将其放入用户信息字典中。我在 Objective-Cloud 上做类似的事情。

userInfo[@"CallStackSymbols2] = exception.callStackSymbols;

类似于调用堆栈返回地址。

我不认为这很好,因为调用堆栈成为异常用户信息的一部分,而不是异常本身。对我来说这不是警告,因为我将异常作为 JSON 发送,因此调用堆栈作为 JSON 对象发送。我不能说,这对你来说是否是个问题。

于 2015-05-19T09:06:47.293 回答