Одна вещь, которую вы можете использовать RecoverableError
- это приложение на основе документов для macOS.
Создайте новый проект macOS> Cocoa, проверив «Создать приложение на основе документов».
Определите свой собственный тип ошибки, соответствующий RecoverableError
.
enum MyError {
case documentSavingError
//...
}
extension MyError: RecoverableError {
var recoveryOptions: [String] {
return [
"Retry", "Ignore"
]
}
func attemptRecovery(optionIndex recoveryOptionIndex: Int) -> Bool {
if recoveryOptionIndex == 0 {//for "Retry"
var result = false
switch self {
case .documentSavingError:
//Attempt "Retry" recovery for the failed operation, and return the result
//...
print("assume recovery attempt successfully finished...")
result = true
//...
}
return result
} else if recoveryOptionIndex == 1 {//for "Ignore"
return true
}
fatalError("something wrong...")
}
}
Измените метод data(ofType:)
в Document.swift, чтобы бросить эту ошибку.
override func data(ofType typeName: String) throws -> Data {
//throw RecoverableError
throw MyError.documentSavingError
}
Вам нужно еще один трюк в текущем приложении документа на основе ...
Создать новый быстрый код подкласса NSApplication
.
import AppKit
@objc(Application)
class Application: NSApplication {
override func presentError(_ error: Error, modalFor window: NSWindow, delegate: Any?, didPresent didPresentSelector: Selector?, contextInfo: UnsafeMutableRawPointer?) {
//print(error)
let underlyingError = (error as NSError).userInfo[NSUnderlyingErrorKey] as? Error ?? error
//print(underlyingError)
super.presentError(underlyingError, modalFor: window, delegate: delegate, didPresent: didPresentSelector, contextInfo: contextInfo)
}
}
текущие документ на основе применения обертки выброшены RecoverableError
в обычном NSError
, так что, без этого, автоматически генерируются NSDocumentErrorRecoveryAttempter
не работает хорошо.
Не забудьте изменить Info.plist, чтобы назначить этот класс его основным классом.
Создайте и запустите приложение, а затем, когда появится окно документа, Файл> Сохранить ... и нажмите «Сохранить» на листе сохранения.
Вы можете найти, как ваш RecoverableError
работает ...
Так, RecoverableError
полезно, когда приложение уже реализует стандартную функцию восстановления, описанную в Error Handling Programming Guide. И его представление ясно говорит:
Важно: NSError
класс доступен как на OS X и IOS. Однако API-интерфейсы и механизмы устранения ошибок и устранения ошибок доступны только в наборе приложений (OS X).
Этот вопрос очень полезен..Не до сих пор никаких ответов..Чтобы за щедрость? –
Я хорошая идея, эта тайна кажется жемчужиной. – TruMan1
Если бы вы этого не сделали, я подумал, чтобы внести свой вклад :) –