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?

Author: János, 2014-08-22

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)
 12
Author: jou,
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]
 42
Author: Martin R,
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()
            })
        }
 2
Author: Yunus T.,
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