Jak używać NSSetUncaughtExceptionHandler w języku Swift
W Objective-C wywołuję metodę NSSetUncaughtExceptionHandler(&exceptionHandler)
do logowania WYJĄTKÓW. Jak nazywa się Swift?
3 answers
Update
Za pomocą Swift 2 można przekazać funkcje Swift i zamknięcia jako wskaźnik funkcji C. Zobacz odpowiedź Martina r poniżej .
Oryginalna odpowiedź
Nie możesz, od Xcode 6 beta 6.Swift obsługuje przekazywanie wskaźników funkcji, ale są one traktowane prawie jak nieprzezroczyste wskaźniki. Nie można ani zdefiniować wskaźnika funkcji C do funkcji Swift, ani też nie można wywołać wskaźnika funkcji C w języku Swift.
To znaczy, że dzwonisz NSSetUncaughtExceptionHandler()
z Swift, ale obsługa musi być zaimplementowana w Objective-C. potrzebujesz pliku nagłówka takiego jak:
volatile void exceptionHandler(NSException *exception);
extern NSUncaughtExceptionHandler *exceptionHandlerPtr;
A w implementacji potrzebujesz czegoś takiego:
volatile void exceptionHandler(NSException *exception) {
// Do stuff
}
NSUncaughtExceptionHandler *exceptionHandlerPtr = &exceptionHandler;
Po zaimportowaniu pliku nagłówka do nagłówka SWIFT, możesz skonfigurować obsługę wyjątków jak zwykle:
NSSetUncaughtExceptionHandler(exceptionHandlerPtr)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:57
Od Swift 2 (Xcode 7) można przekazać funkcje/zamknięcia Swift do parametrów przyjmujących wskaźnik funkcji C. Z informacji o wydaniu Xcode 7:
Natywne wsparcie dla wskaźników funkcji C: Funkcje C, które przyjmują funkcję argumenty wskaźnika mogą być wywoływane za pomocą zamknięć lub funkcji globalnych, z zastrzeżeniem, że zamknięcie nie może uchwycić żadnego z jego lokalny kontekst.
Więc to kompiluje i działa:
func exceptionHandler(exception : NSException) {
print(exception)
print(exception.callStackSymbols)
}
NSSetUncaughtExceptionHandler(exceptionHandler)
Lub z " inline" zamknięcie:
NSSetUncaughtExceptionHandler { exception in
print(exception)
print(exception.callStackSymbols)
}
To robi dokładnie to samo co odpowiedni kod Objective-C:
łapie w inny sposób nieprzygotowane NSException
s.
Więc to zostanie złapane:
let array = NSArray()
let elem = array.objectAtIndex(99)
Uwaga: - It Nie wyłapuje żadnych błędów Swift 2 (z throw
) ani błędów runtime Swift, więc nie jest to wyłapywane:
let arr = [1, 2, 3]
let elem = arr[4]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-16 06:06:44
Błąd, który można zobaczyć przy otwarciu kolejnej aplikacji w ten sposób.
Ten kod do swift 4.
Dodaj didFinishLaunchingWithOptions()
:
NSSetUncaughtExceptionHandler { exception in
print("Error Handling: ", exception)
print("Error Handling callStackSymbols: ", exception.callStackSymbols)
UserDefaults.standard.set(exception.callStackSymbols, forKey: "ExceptionHandler")
UserDefaults.standard.synchronize()
}
I kod Dodać w fistViewController viewLoad()
// ERROR ExceptionHandler
if let exception = UserDefaults.standard.object(forKey: "ExceptionHandler") as? [String] {
print("Error was occured on previous session! \n", exception, "\n\n-------------------------")
var exceptions = ""
for e in exception {
exceptions = exceptions + e + "\n"
}
AlertFunctions.messageType.showYesNoAlert("Error was occured on previous session!", bodyMessage: exceptions, {
}, no: {
UserDefaults.standard.removeObject(forKey: "ExceptionHandler")
UserDefaults.standard.synchronize()
})
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-05 15:23:36