Как обрабатывать ошибки без остановки выполнения
У меня есть небольшой сценарий dxl, и мне нужно вернуть количество назначенных позиций из массива, скажем, размера 20, в котором назначено только 10 позиций.
Я пытался использовать функции noError() и lastError(), но после вызова lastError() сценарий останавливается, и я не могу продолжить выполнение. Вот мой код:
int returnArrayLength(string array[]){
int lengthOfArray = 0,i = 0;
for (i=0; i < sizeof array ; i++){
noError()
if (!null array[i]){
lengthOfArray++
print lengthOfArray
}
if (!null lastError()){
print "Exception caught!" // not printed
break
}
}
return lengthOfArray
}
string labels[6]
labels[0] = "label0"
labels[1] = "label1"
labels[2] = "label2"
labels[3] = "label3"
print returnArrayLength(labels) // not printed
Приведенный выше код печатает следующее: 1 2 3 4
Как я могу возобновить выполнение после вызова функции lastError()?
1 ответ
Это было сложнее, чем я думал, что будет!
Таким образом, как оказалось, ошибка неназначенного элемента полностью останавливает программу DXL. Так что нам нужно сделать?
Что ж, нам нужно запустить фрагмент кода в его собственной среде и позволить ему аварийно завершить работу, если это необходимо!
Для этого нам нужно создать eval_, передать ему наш массив, а затем вернуть return_ (который не будет выполнен, если eval_ завершится ошибкой)
Взглянуть:
int returnArrayLength(string array[]){
int lengthOfArray = 0,i = 0;
for (i=0; i < sizeof array ; i++){
string scode = "noError()
string ( &passedAr)[] = (addr_ "( ( addr_ array ) int ) ")
string s = passedAr["i"]
lastError()
return_ \"Y\""
if ( ( eval_ scode ) == "Y" ){
lengthOfArray++
print lengthOfArray
} else {
print "Exception caught!" "\n"
break
}
}
return lengthOfArray
}
string labels[6]
labels[0] = "label0"
labels[1] = "label1"
labels[2] = "label2"
labels[3] = "label3"
print returnArrayLength(labels)
Какая фантастическая маленькая проблема.
Ресурсы, которые я использовал, чтобы помочь решить эту проблему:
Тестирование на неназначенные переменные - этот не совсем работает из-за природы массивов, по крайней мере, насколько я могу судить!
В любом случае, спасибо за вызов!