Как обрабатывать ошибки без остановки выполнения - PullRequest
0 голосов
/ 09 января 2019

У меня есть небольшой скрипт 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 Ответ

0 голосов
/ 10 января 2019

Это было сложнее, чем я думал, что будет!

Итак, как оказалось, ошибка неназначенного элемента полностью останавливает программу 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)

Какая фантастическая маленькая проблема.

Ресурсы, которые я использовал для решения этой проблемы:

Как передать массив в eval_

eval_, addr_ и утечки памяти

Тестирование на неназначенные переменные - Это не совсем работает из-за природы массивов, по крайней мере, насколько я могу судить!

В любом случае, спасибо за вызов!

...