为什么@try阻止工作?它崩溃了应用程序,但它应该被@try块捕获.
NSString* test = [NSString stringWithString:@"ss"];
@try {
[test characterAtIndex:6];
}
@catch (NSException * e) {
NSLog(@"Exception: %@", e);
}
@finally {
NSLog(@"finally");
}
Run Code Online (Sandbox Code Playgroud) 每次我的应用程序崩溃时,Xcode都会在main()函数中突出显示UIApicationMain()调用,导致崩溃.在某些情况下,以前是正常的(例如分段错误),但我试图处理的崩溃是一个简单的SIGABRT,其中记录了控制台中的详细信息:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)'
Run Code Online (Sandbox Code Playgroud)
Xcode用于显示旧版SDK的正确行,但自从我升级到Xocde 4.2后发生了变化.很明显,Xcode确切地知道导致崩溃的原因(或者可能知道),但它仍然没有显示实际的行.这有什么修复或解决方法吗?
Swift中的以下代码引发NSInvalidArgumentException异常:
task = NSTask()
task.launchPath = "/SomeWrongPath"
task.launch()
Run Code Online (Sandbox Code Playgroud)
我该如何捕捉异常?据我所知,Swift中的try/catch是针对Swift中抛出的错误,而不是针对像NSTask这样的对象引发的NSExceptions(我猜这是用ObjC编写的).我是Swift的新手,所以可能是我错过了一些明显的东西......
编辑:这是一个关于bug的雷达(特别是对于NSTask):openradar.appspot.com/22837476
我对KVO比较陌生,所以我很有可能违反了一些基本规则.我正在使用核心数据.
我的应用程序崩溃了以下消息:我无法理解的是为什么CGImage参与观察在MeasurementPointer对象上设置的值.
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '<CGImage 0x276fc0>: An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.
Key path: measurementDescriptor
Observed object: <MeasurementPointer: 0x8201640> (entity: MeasurementPointer; id: 0x8200410 <x-coredata://EBEE0687-D67D-4B03-8C95-F4C60CFDC20F/MeasurementPointer/p75> ; data: {
measurementDescriptor = "0x260fd0 <x-coredata://EBEE0687-D67D-4B03-8C95-F4C60CFDC20F/MeasurementDescriptor/p22>";
})
Change: {
kind = 1;
new = "<MeasurementDescriptor: 0x262530> (entity: MeasurementDescriptor; id: 0x260fd0 <x-coredata://EBEE0687-D67D-4B03-8C95-F4C60CFDC20F/MeasurementDescriptor/p22> ; data: {\n measurementName = Temperature;\n measurementUnits = \"\\U00b0C\";\n sortString = nil;\n})";
}
Context: 0x0'
*** Call stack at first throw:
(
0 CoreFoundation 0x30897ed3 …Run Code Online (Sandbox Code Playgroud) 我找到了几个崩溃报告的原因unexpected start state.我的代码看起来像这样:
NSRange range = [content rangeOfString:@"<html>"];
if (range.location != NSNotFound) {
NSString *htmlStr = [content substringFromIndex:range.location];
NSAttributedString *attStr = [[NSAttributedString alloc] initWithData:[htmlStr dataUsingEncoding:NSUnicodeStringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType} documentAttributes:nil error:nil];
return attStr.string;
}
Run Code Online (Sandbox Code Playgroud)
崩溃报告如下所示:
我正在使用XCTest编写Cocoa单元测试,并且最近第一次使用了XCTAssertThrows.这很酷,但我想用XCTAssertThrowsSpecific让它变得更好,并且需要一定的异常.
这是一个示例测试:
-(void)testShortPassword {
XCTAssertThrows([user storePassword:@"abc"],@"Expect exception for short pw");
}
Run Code Online (Sandbox Code Playgroud)
在我的用户类中,我有以下代码:
-(void)storePassword:(NSString*)password {
NSCAssert(password.length > 6, @"Password must be longer than 6 characters");
// go on to store the password on the keychain
}
Run Code Online (Sandbox Code Playgroud)
请记住,Cocoa通常不会使用异常(因此最好返回错误,并在前面的示例中显示UI等).如何以可被捕获的方式抛出异常XCTAssertThrowsSpecific?我如何指定XCTAssertThrowsSpecific(expression, specificException, format...)?
单击按钮转到新视图时,我的应用程序崩溃.这出现了:
int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
Run Code Online (Sandbox Code Playgroud)
"return UIApplicationMain ..."以绿色突出显示,最后是"Thread 1:Signal SIGABRT".该错误还包括输出中的:
**Terminating app due to uncaught exception *** 'NSUnknownKeyException reason:'[<SlopeViewController 0x8b68c70> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key m.' *** First throw call stack: (0x16b19b8 0x14328b6 0x17407c1 0x10f00ee 0x105c7db 0x105bd33 0x10be069 0x4b579b 0x14447d2 0x16acf5a 0x4b42f4 0x336e79 0x337491 0x337792 0x337c98 0x345912 0x345c5a 0x5aca79 0x34279a 0x3429a0 0x3429e0 0x73dd2b 0x72e181 0x72e1fc 0x1444874 0x2343b7 0x234343 0x32027e 0x320641 0x31f8fd …Run Code Online (Sandbox Code Playgroud) 当我的iPhone应用程序崩溃后,当我调出控制台时,它经常会说"无法识别的选择器发送到实例0x等等等等." 我怎样才能找出这是什么变量?调试器中有没有办法?它甚至可能吗?谢谢.
首先,我是iOS和Swift的新手,来自Android/Java编程背景.因此,对于我来说,尝试写入文件时捕获异常的想法是第二天性,如果缺少空间,文件权限问题或文件中可能发生的任何其他事情(根据我的经验,已发生) .我也明白,在Swift中,异常与Android/Java不同,所以这不是我在这里要求的.
我试图使用NSFileHandle附加到一个文件,如下所示:
let fileHandle: NSFileHandle? = NSFileHandle(forUpdatingAtPath: filename)
if fileHandle == nil {
//print message showing failure
} else {
let fileString = "print me to file"
let data = fileString.dataUsingEncoding(NSUTF8StringEncoding)
fileHandle?.seekToEndOfFile()
fileHandle?.writeData(data!)
}
Run Code Online (Sandbox Code Playgroud)
但是,函数seekToEndOfFile()和writeData()函数都表明它们会抛出某种异常:
如果文件描述符已关闭或无效,如果接收器表示未连接的管道或套接字端点,文件系统上没有剩余空闲空间,或者发生任何其他写入错误,则此方法引发异常. - Apple文档
writeData()
那么在Swift 2.0中处理这个问题的正确方法是什么?我读过的联系
斯威夫特语言错误处理,的try-catch斯威夫特例外,NSFileHandle写数据:异常处理,雨燕2.0的异常处理,以及如何捕捉在斯威夫特的例外,但他们都没有直接回答我的问题.我确实读过一些关于在Swift代码中使用objective-C的东西,但由于我是iOS新手,我不知道这个方法是什么,似乎无法在任何地方找到它.我还尝试了新的Swift 2.0 do-catch块,但他们没有意识到NSFileHandle方法会抛出任何类型的错误,很可能因为函数文档没有throw关键字.
我知道我可以让应用程序崩溃,如果它用完了空间或其他什么,但由于应用程序可能会在以后发布到应用商店,我不希望这样.那么我如何以Swift 2.0的方式做到这一点呢?
编辑: 这个目前只是一个只有Swift代码的项目,所以即使看起来有一种方法可以在Objective-C中做到这一点,我也不知道如何将两者混合在一起.
我最近开始学习Objective-C,我正在开发一个iOS应用程序作为练习,无论如何,我想通过抛出异常来处理溢出(我来自Java背景),我只搜索引用NSException,但后来我阅读有关异常处理主题的部分,他们说要使用NSError,我读了参考但他们有相同的协议和方法,那么它们之间的区别是什么?哪个更好?
另外,我想创建自己的异常或错误类,是否应该包含任何方法或字段?(就像Exception在Java中实现接口时一样).谢谢
nsexception ×10
objective-c ×5
ios ×4
iphone ×3
cocoa-touch ×2
exception ×2
swift ×2
xcode ×2
crash ×1
foundation ×1
nserror ×1
nsfilehandle ×1
swift2 ×1
unit-testing ×1
xctest ×1