Что нового

Использование @error

F9

Новичок
Сообщения
71
Репутация
2
Всем привет!
ПОмогите понять логику использования макроса @error.
Хочу заменить стандартное сообщение (см.вложение)

на своё собственное и исключить завершение программы при этом.

Есть функция поиска номера документа в файле. Файл определенного формата, номер во второй строке первым вхождением до символа ";"

Код:
;~ Find № Doc
Func _FindNum($currfile)

	If Not _FileReadToArray($currfile,$aRecords) Then
	   MsgBox(4096,"Error", " Error reading log to Array     error:" & @error)
	   Exit
	EndIf
	For $x = 2 to 2
		$enakl = StringRegExp($aRecords[$x], '(.*?)(?:\;|})', 1)
		$Nenakl=_ArrayToString($enakl)
	Next

EndFunc ;~

Но при несоблюдении условий содержимого файла, естественно имеем стандартную ошибку и завершение работы программы.

ПРошу помощи, научите пользоваться @error'ом :whistle:
Не нашёл в Help'е описание кодов @error, что означают возвращаемые 1, 2 или 3 ?
 

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
можно просто использовать условие после , к примеру, чтения файла в массив
Код:
_FileReadToArray($currfile,$aRecords)
If @error Then
; выход или продолжение работы
EndIf

или
Код:
Switch @error
	Case 1
		;...........................
	Case 2
		;.................
EndSwitch
 

Fever

Скриптер
Сообщения
308
Репутация
112
F9
@error - просто макрос,
его значение может модифицировать любая ф-ция

Код:
Func func1()
   seterror(1) ; значение @error
endfunc

func1()

if @error then msgbox(16, "", @error)
 
Автор
F9

F9

Новичок
Сообщения
71
Репутация
2
Что-то никак непойму:
Код:
Func _FindNum($currfile)

	If Not _FileReadToArray($currfile,$aRecords) Then
	   MsgBox(4096,"Error" &@error, "Невозможно считать данные из накладной "&@CR&"Возможно файл "&$currfile &" не содержит данных")
	   Exit
	EndIf
	For $x = 2 to 2
	If  @error Then
		MsgBox(4096, "", "Файл" &$aRecords[$x]& "не является заявкой")
	Else
		$enakl = StringRegExp($aRecords[$x], '(.*?)(?:\;|})', 1)
		if @error then MsgBox(0,"","Errror" &@error)
		$Nenakl=_ArrayToString($enakl)
	EndIf
	Next

EndFunc ;~ ******************************************


У меня даже msgBox не появляется, сразу рушится (с использованием заведомо неверного файла)
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
У Вас возникает ошибка еще в коде. По этому и не выводятся Ваши сообщения.
 

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
F9 этот макрос откуда берется?
Код:
If  @error Then
        MsgBox(4096, "", "Файл" &$aRecords[$x]& "не является заявкой")
    Else

я показал в примере как можно употребить этот макрос. то есть сразу после строки
Код:
_FileReadToArray($currfile,$aRecords)

можно переменной присвоит значение макроса.
Код:
_FileReadToArray($currfile,$aRecords) 
$error = @error



в твоем случае можно так
Код:
Func _FindNum($currfile)
_FileReadToArray($currfile,$aRecords)
    If @error  Then
       MsgBox(4096,"Error" &@error, "Невозможно считать данные из накладной "&@CR&"Возможно файл "&$currfile &" не содержит данных")
       Exit
   else
    For $x = 2 to 2; здесь один шаг. зачем цикл? можно так - $enakl = StringRegExp($aRecords[2], '(.*?)(?:\;|})', 1)
        $enakl = StringRegExp($aRecords[$x], '(.*?)(?:\;|})', 1)
        $Nenakl=_ArrayToString($enakl)
    Next
    EndIf
EndFunc
 
Автор
F9

F9

Новичок
Сообщения
71
Репутация
2
У Вас возникает ошибка еще в коде. По этому и не выводятся Ваши сообщения.
пардон, в коде нет ошибки. В зависимости от содержимого файла - он компилится или не компилится. Если я его соберу в EXE, он выводит сообщение (см. вложение)

Да. Действительно, изначально был перебор нескольких строк, потом только договорились что номер будет только во 2ой строке. Забыл переделать.
присвоит значение макроса.
А расшифровку где можно посмотреть, что означают коды ошибок

Не понял суть вопроса
этот макрос откуда берется?
 

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
обычно макрос ошибки используют сразу после функции.
здесь к чему макрос ошибки?
Код:
For $x = 2 to 2
    If  @error Then
        MsgBox(4096, "", "Файл" &$aRecords[$x]& "не является заявкой")
    Else


F9 [?]
А расшифровку где можно посмотреть, что означают коды ошибок
можно макросу присваивать свои значения..
если делаем функцию и при работе может возникнуть ошибка, то мы можем назначит свое значение..чтобы потом определить что и где произошло. например
Код:
_FileReadToArray($currfile,$aRecords)
    If @error  Then
       MsgBox(4096,"Error" &@error, "Невозможно считать данные из накладной "&@CR&"Возможно файл "&$currfile &" не содержит данных")
       Return Seterror(1,'','');   тут мы назначаем свою ошибку. на выходе мы можем смотреть свой макрос ошибки..и получим единицу..значит будем знать в данном случае, что была ошибка чтения файла в массив.выход из функции без завершения всего скрипта. если функция одна и не в цикле, то будет просто выход и завершение программы




Добавлено:
Сообщение автоматически объединено:

вот дополнительный пример для получения своего макроса ошибки
Код:
#include <array.au3>
#include <File.au3>
$File = @ScriptDir & '\1.txt'
$Ret = _ReadToArray($File)
If @error Then; здесь получаем через макрос ошибку то значение ошибки, которое мы назначили в функции
	MsgBox(0,'Ошибка',@error)
Else
	_ArrayDisplay($Ret)
EndIf

Func _ReadToArray($sFile)
	Local $array[1]
	_FileReadToArray($sFile,$array)
	If @error Then	Return SetError(1); назначаем значение ошибки для использования в макросе
	Return $array
EndFunc
 
Автор
F9

F9

Новичок
Сообщения
71
Репутация
2
Ок, тут понятно...
Но непонятно теперь - возможно ли вообще заменить стандартное сообщение AutoIT типа
Код:
Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
на своё сообщение?

В итоге нужно осуществить две проверки: на то что файл != 0 и что в файле, если он != 0 имеется хотя бы две строки (а может просто не считывать эти файлы в массив вообще?)
проверка на размер файла не равный нулю нужна для корректной работы _FileReadtoArray, а вторая проверка нужна для считывания номера документа из файла (вторая строка)

Код:
;~ Find № Doc
Func _FindNum($currfile)

	 _FileReadToArray($currfile,$aRecords)
	   if @error then
			MsgBox(4096,"Error" &@error, "Невозможно считать данные из накладной "&@CR&"Возможно файл "&$currfile &" не содержит данных")
	   Exit
	Else
;~ 	If  @error Then MsgBox(4096, "", "Файл" &$aRecords[2]& "не является заявкой")
		$enakl = StringRegExp($aRecords[2], '(.*?)(?:\;|})', 1)
		$Nenakl=_ArrayToString($enakl)
EndIf
EndFunc ;
 

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
F9 [?]
Но непонятно теперь - возможно ли вообще заменить стандартное сообщение AutoIT типа
ну так я ж показал пример :smile:
да, нужно устанавливать свои error в функции. можно с проверки существования файла, а можно просто основываться на ошибках чтения из файла.
открой любую библиотеку и посмотри как в функциях назначается error
в твоем случае ошибка говорит о том, что некорректный(несуществующий ) индекс в массиве. то есть может быть ты неправильно объявил массив, а может не было чтения из файла, поэтому массив так и остался с одной строкой, а значит невозможно получить значение второго индекса массива(второй строки). поэтому скрипт вываливается с ошибкой. если была ошибка чтения, то нам не нужно оговаривать ошибку работы со вторым индексом.
если же было чтение, но при этом нет второй строки, то нужно оговорить ошибку
к примеру проверить размерность массива
Код:
If Not Ubound($aRecords) = 3  Then; если массив не имеет трех строк, то нельзя получить значение $aRecords[2].
 Return SetError(1); значит назначаем ошибку и выходим
Else ; массив имеет три строки, а значит в массиве есть значение $aRecords[2]
        $enakl = StringRegExp($aRecords[2], '(.*?)(?:\;|})', 1)
        $Nenakl=_ArrayToString($enakl)
EndIf



Добавлено:
Сообщение автоматически объединено:

в итоге примерно будет так
Код:
Func _FindNum($currfile)
	_FileReadToArray($currfile, $aRecords)
	If @error Then
		MsgBox(4096, "Error" & @error, "Невозможно считать данные из накладной " & @CR & "Возможно файл " & $currfile & " не содержит данных")
		Exit
	Else
		If Not UBound($aRecords) = 3 Then; если массив не имеет трех строк, то нельзя получить значение $aRecords[2].
			Return SetError(1); значит назначаем ошибку и выходим. скрипт не вывалится с ошибкой. можно назначить MsgBox и выход
		Else ; массив имеет три строки, а значит в массиве есть значение $aRecords[2]
			$enakl = StringRegExp($aRecords[2], '(.*?)(?:\;|})', 1)
			$Nenakl = _ArrayToString($enakl)
		EndIf
	EndIf
EndFunc
 
Верх