Использование NSSetUncaughtExceptionHandler в Swift 4

То, что вы сейчас делаете, следующее:

lua A.lua
> lua process starts
> loading A.lua
> loading test.lua (because it is required by A.lua)
> set global "num" to value 2
> set global "num" to value 5
> lua process exits (A.lua finished)
lua B.lua
> lua process starts
> loading B.lua
> loading test.lua (because it is required by B.lua)
> set global "num" to value 2
> print global "num" (which was set to 2 by test.lua)
> lua process exits (B.lua finished)

Чтобы напечатать значение 5, ваши сценарии должны выглядеть так:

-- test.lua
num = 2

-- A.lua
require("test")
num = 5

-- B.lua
require("test")
require("A")
print(num)

, которые приведут к:

lua B.lua
> lua process starts
> loading B.lua
> loading test.lua (because it is required by B.lua)
> set global "num" to value 2
> loading A.lua (because it is required by B.lua)
> skip loading test.lua (has already been loaded)
> set global "num" to value 5
> print global "num"
> lua process exits (B.lua finished)

РЕДАКТИРОВАТЬ: Я вижу, что вы используете C Api Lua, а не Lua для выполнения ваших скриптов. Используя программирование api, вы должны получить желаемый результат, выполнив A.lua и B.lua, используя одно и то же lua-состояние (чаще всего хранящееся в C-Variable "L").

2
задан Niloufar 19 January 2019 в 12:12
поделиться

1 ответ

Подводя итог вышеприведенному обсуждению: В вашем подходе есть различные проблемы:

  • Аргументом к NSSetUncaughtExceptionHandler является указатель на функцию C. Вы можете передать замыкание в Swift, но только если замыкание не захватывает какой-либо контекст. В вашем случае замыкание не может использовать self. Решение из Как использовать метод экземпляра в качестве обратного вызова для функции, которая принимает только функцию или закрытие литерала ? не может использоваться здесь, потому что NSSetUncaughtExceptionHandler() не имеет параметра «context».

  • Даже если вам удастся сослаться на делегат приложения в обработчике исключений: он может вызываться в любом потоке, поэтому может вызываться неопределенное поведение для вызова любых связанных с пользовательским интерфейсом методов, таких как добавление представлений или меток. [ 1113]

  • NSSetUncaughtExceptionHandler ловит только исключения Objective-C, но не ошибки Swift (из throw) или исключения среды выполнения Swift (такие как «неожиданно найденный ноль»).

  • Даже если исключение поймано, вы не можете «обработать» его таким образом, чтобы программа продолжала впоследствии. Он все равно рухнет.

Вы написали в комментарии

Я хочу справиться с этим, когда получаю нулевые значения из моего API ... но чтобы быть в безопасности, я хочу предотвратить приложение от авария.

Обработчик исключений не подходит для этой цели. Используйте необязательную привязку, дополнительные приведения, охранники и т. Д. Для обработки ответа и избегайте исключений времени выполнения.

0
ответ дан Martin R 19 January 2019 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: