- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有相当多的适用于 Mac OS 10.11 及更高版本的 Swift 3 代码(使用 Xcode 8.2.1)。有许多进程,其中包括 GUI 应用程序和后台服务。这两者都使用自定义 URLProtocol
,该框架在框架中实现(由应用程序和服务导入)。协议(protocol)有时可能会生成符合 Error
的 enum
实例,它会捕获并适当处理这些实例(通常通过使用 URLProtocolClient 将它们扔到 URLSession 中,试图使请求)。
在调试器中徘徊表明,当运行时将 Error
自动转换为 NSError
时,就会发生此崩溃。我在代码中显式添加了此转换,果然,我在该行上遇到了相同的崩溃。
我看到了Swift 3.1: Crash when custom error is converted to NSError to access its domain property ,但不适用于此处:
Error
扩展为 CustomNSError
(以及 LocalizedError
为了更好的措施)并实现相关属性 - 没有帮助。域名
之后;据我所知,这对我来说不是问题。在尝试了该问题唯一列出的解决方案后,我有些不知所措。我已经调试了几个小时,除了它似乎发生在 dyld
内部深处的某个地方之外,没有任何进展。
代码:
enum CrowbarProtocolError: Error {
case FailedToCreateSocket;
case PathTooLong;
case NonSocketFile;
case SocketNotFound;
...
case UnrecognizedError(errno: Int32);
}
extension CrowbarProtocolError: LocalizedError {
public var errorDescription: String? {
return "Some localized description"
}
}
extension CrowbarProtocolError: CustomNSError {
public static var errorDomain: String {
return "Some Domain Name"
}
public var errorCode: Int {
return 204 //Should be your custom error code.
}
public var errorUserInfo: [String: Any] {
return ["WTF": "Swift?"];
}
}
...
open class CrowbarUrlProtocol: URLProtocol {
...
override open func startLoading() {
do {
let sockHandle = try CrowbarUrlProtocol.openSocket();
let req = try buildRequestData();
sockHandle.write(req);
NotificationCenter.default.addObserver(
self,
selector: #selector(self.readCompleted),
name: .NSFileHandleReadToEndOfFileCompletion,
object: nil);
sockHandle.readToEndOfFileInBackgroundAndNotify();
} catch let err {
Log.warn("CrowbarUrlProtocol request failed with error \(err)");
// -- In the background service, THIS LINE CRASHES! --
let err2 = err as NSError;
Log.warn("As NSError: \(err2)");
// -- Without the explicit cast, it crashes on this line --
self.client?.urlProtocol(self, didFailWithError: err);
}
}
...
}
我解决这个问题的一个想法就是使用 NSError
做所有事情(或者尽可能多地),因为如果永远不需要转换 Error
到 NSError
,那么导致此崩溃的任何原因都不会发生。不知道它是否有效,但似乎值得一试......
最佳答案
好吧,据我所知,这只是 Swift 运行时中的一个错误,但我找到了一个解决方法:只需对涉及 Obj-C 代码而不是 Swift 的所有内容使用 NSError
>错误(以避免隐式转换)。由于我已经实现了 CustomNSError
,因此很容易在我的 Error
枚举上创建一个 toNSError()
函数,并将其用于 self.client?.urlProtocol(self, didFailWithError: err)
行。
enum CrowbarProtocolError: Error, CustomNSError {
case FailedToCreateSocket;
case PathTooLong;
...
public func asNSError() -> NSError {
return NSError(domain: CrowbarProtocolError.errorDomain,
code: self.errorCode,
userInfo: self.errorUserInfo);
}
}
...
open class CrowbarUrlProtocol: URLProtocol {
...
override open func startLoading() {
do {
let sockHandle = try CrowbarUrlProtocol.openSocket();
let req = try buildRequestData();
sockHandle.write(req);
NotificationCenter.default.addObserver(
self,
selector: #selector(self.readCompleted),
name: .NSFileHandleReadToEndOfFileCompletion,
object: nil);
sockHandle.readToEndOfFileInBackgroundAndNotify();
} catch let err as CrowbarProtocolError {
Log.warn("CrowbarUrlProtocol request failed with error \(err)");
self.client?.urlProtocol(self, didFailWithError: err.asNSError());
}
catch let err {
Log.warn("CrowbarUrlProtocol caught non-CrowbarProtocol Error \(err)");
// This would probably crash the service, but shouldn't ever happen
self.client?.urlProtocol(self, didFailWithError: err);
}
}
...
}
关于将 Error 转换为 NSError 时,Swift 3 自定义 URLProtocol 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43859552/
我意识到这与此处的现有帖子相似,What's the Point of (NSError**)error? ,但我的问题有点不同。我了解双指针的工作原理,以及这是常见的 iOS API 错误模式。我的
我刚刚升级到 Xcode 6.3 和 Swift 1.2,并且正在更新语法。在我的项目中,我使用 TCBlobDownloadSwift用于一些常规下载任务。更新后,我从框架的以下方法中收到编译器错误
在下面的代码中NSError实例化(match是GameCenter的GKMatch): ... NSString * deviceID = appDelegate.deviceID;
我开发了一个 ios 应用程序,它有: NSError *error; 代替: NSError *error = nil; 当我在模拟器中调试和连接时在设备上调试时,它工作正常。在我将其存档并将其发
在我的 iOS 应用程序中,我需要播放声音。我有以下代码: var audioFileLocationUrl = NSBundle.mainBundle().pathForResource("midn
我正在使用外部组件连接到 SOAP 服务。当我收到结果时,它作为对象 value 返回,它可以包含 NSError 或结果对象。 如果出现错误,我想提取错误代码和消息。如何将 value 转换为 NS
我有一个 NSError ** 存储在一个数组中(所以我可以这样得到它 array[0])。我正在尝试将其转换为变量: NSError * __autoreleasing *errorPointer
我需要另一双眼睛。 奇怪的是,我似乎无法访问自定义 NSError 的属性。我不断收到 EXC_BAD_ACCESS 错误。这是我的代码: if (response.isUnautho
我收到这个错误: incompatible pointer types assigning to NSError _strong from NSError _autoreleasing 这是我的头文件
我正在 swift 中使用 AFNetworking,并且在将以下代码转换为 swift 时遇到问题 objective-c [client GET:url parameters:nil succes
physicsWorld.gravity = CGVector(dx: 0, dy: -2) physicsWorld.contactDelegate = self motionMan
这个问题类似于ios NSError types但是那里描述的解决方案没有用,我相信这不是我所需要的。 我有一个执行异步调用然后调用完成 block 的方法。当我尝试将 NSError ** 传递给完
我试图在 if let jsonData Array = try NSJSONSerialization... 行中从 Swift 1 转换为 2,因为它最初给了我一个来自“额外参数‘错误’的错误”
最近我刚刚将 swift 2.3 项目转换为 3.2,alamofire 也得到了转换,我收到了很多问题,其中大部分都已解决,现在我被给定的两个问题所困扰 问题在 alamofire 的 Respon
在我使用该方法之前几次... NSURLResponse *response; NSError *error; NSData *data = [NSURLConnection sendSynchron
这个相对简单的enum,编译得很好,但是...... public protocol AuthKitErrorProtocol { var error: NSError { get } } e
你好, 我正在尝试为接受 *NSError 作为参数的代码设置一些单元测试。如果存在验证问题,则不会保存对象并设置 NSError 条件。 我的方法是: - (BOOL)validateConsist
我想我在 NSError 上发现了一个错误,但想运行它让你们通过,看看是否真的只是我做错了什么。 在向使用 userInfo 的 NSError 实例发送描述时发生崩溃。如果将 userInfo 设置
对于这个问题,我使用的是我的实际代码的精简版本。 该应用程序使用 MVVM 架构构建。假设有一个登录屏幕。有3个文件。 ApiClient 文件与服务器通信并获取响应。如果输入的用户名和密码匹配,它会
例如 NSError *error = nil; if ([something error:&error]) { // ... } // ... if ([somethingElse er
我是一名优秀的程序员,十分优秀!