Что нового

SetError() не работает так, как заявлено в справке.

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
По идеи как я понял из справки SetError() не только должна возвратить три параметра (два из них опционально) но и перекрыть возвращаемое функцией значение, если указан третий параметр.
Но, вот пример:
Код:
$Result = test()
ConsoleWrite("Error: " & @error & @CRLF & "Extended: " & @extended & @CRLF & "Value: " & $Result & @CRLF)
Func test()
	SetError(1, 10, 500)
EndFunc

Функция тут должна вернуть (как заявлено в справке) три значения, @error, @extended и значение переменной $Result.
Но по факту значение переменной $Result не возвращается!

Однако если написать так:
Код:
Return SetError(1, 10, 500)

Значение $Result возвращается!

Как говорил Бунша Иван Васильевич:
"Меня опять терзают смутные сомнения. У Шпака - магнитофон, у посла - медальон... "
Вот и меня терзают, не баг ли это?
Что скажите коллеги?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Не баг.

Функции в AutoIt всегда возвращают только то, что следует за "Return". Если "Return" отсутствует, то всегда (?) возвращается 0. А третий параметр в функции SetError(), это просто "сквозное" значение, т.е. SetError() его просто тупо возвращает.

Код:
ConsoleWrite(SetError(1, 10, 500) & @CR)


И это действительно очень удобно.

Код:
Return SetError(1, 10, 500)


Т.е. 500 проходит на выход SetError() и попадает на "Return" а затем на выход пользовательской функции.

По-другому можно записать так:

Код:
Func test()
    SetError(1, 10)
	Return 500
EndFunc


 

SyDr

Сидра
Сообщения
651
Репутация
158
Уже расписали, ну да ладно:
Garrett [?]
но и перекрыть возвращаемое функцией значение, если указан третий параметр.
Как написано, так и делает :smile:
Параметры
return value [optional] Override the default return value and return this parameter.
Перекрывает возвращаемое значение по умолчанию (самой функции SetError, а не какой-либо другой функции) и возвращает этот параметр.
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
ещё так можно

Код:
Func _1()
	
	If SetError(1, 0, 1) Then Return 1
	
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
FlatX007 сказал(а):
ещё так можно

Код:
Func _1()
	
	If SetError(1, 0, 1) Then Return 1
	
EndFunc
:blink:

Это абсурд. В таком случае можно и так:

Код:
If 1 Then 
	Return SetError(1, 0, 1)
EndIf


Нужно писать так:

Код:
Return SetError(1, 0, 1)
 
Автор
Garrett

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Yashied [?]
А третий параметр в функции SetError(), это просто "сквозное" значение, т.е. SetError() его просто тупо возвращает.
Да, я понимаю!
И это действительно очень удобно.
Полностью согласен!
Т.е. 500 проходит на выход SetError() и попадает на "Return" а затем на выход пользовательской функции.
В том-то и дело что у меня
Код:
ConsoleWrite(SetError(1, 10, 500) & @CR)

не возвращает 500! Возвращается ноль!
Autoit 3.3.6.1
У вас возвращает? :shok:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Код:
>"C:\Program Files\AutoIt3\autoit3.exe" /ErrorStdOut "E:\Desktop\New AutoIt v3 Script.au3"    
500
>Exit code: 0    Time: 0.490
 
Автор
Garrett

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Yashied сказал(а):
Код:
>"C:\Program Files\AutoIt3\autoit3.exe" /ErrorStdOut "E:\Desktop\New AutoIt v3 Script.au3"    
500
>Exit code: 0    Time: 0.490
Опа! Тогда ой, буду искать причину у себя :(



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

Yashied сказал(а):
Нужно писать так:
Код:
Return SetError(1, 0, 1)
То есть Return всё же необходим перед SetError!
Потому как первое и второе значения SetError возвращаются без Return, а вот третье только с Return!
Спасибо Yashied! :ok:
Спасибо Всем!
 

SyDr

Сидра
Сообщения
651
Репутация
158
Garrett [?]
Потому как первое и второе значения SetError возвращаются без Return, а вот третье только с Return!
Первое и второе значения не возвращаются! И пользовательская функция возвращает значение только через Return. Никакие другие функции для этого не предназначены.

Значение @error устанавливается равным 1-ому параметру функции.
Значение @extended устанавливается равным 2-ому параметру функции.
3-параметр возвращает сама функция SetError()
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Garrett сказал(а):
Потому как первое и второе значения SetError возвращаются без Return...
@error и @extended не возвращаются функцией, а устанавливаются. Функция может явно возвращать только один параметр, через Return. А @error и @extended, это просто глобальные переменные для контроля ошибок, которые устанавливают большинство функций AutoIt. И для пользователя тоже предоставили такую возможность, чере функцию SetError() / SetExtended(). Причем, проверять значения этих переменных нужно сразу же после выполнения той или иной функции. Следующая проверка будет неверной:

Код:
$Label = DriveGetLabel('C:\')
ConsoleWrite($Label & @CR)
If @error Then
	; Ошибка!
EndIf


Именно поэтому я рекомендую по возможности всегда проверять возвращаемое значение, а не @error.

Код:
$Type = DriveGetType('C:\')
...
If Not $Type Then
	; Ошибка!
EndIf
 
Автор
Garrett

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Yashied
Я уже разобрался, спасибо! :ok:

Просто у меня сложилось мнение ( с моим английским :-[ ) что SetError() именно возвращает третий параметр подобно Retern.
Грубо говоря, я думал, что в SetError() для третьего параметра уже встроена ф-ция Return.
IMHO так
Код:
SetError(1, 0, $Result)

было бы удобнее, чем так
Код:
Return SetError(1, 0, $Result))

Просто раньше я не использовал третий параметр, а тут подумал, чего добру пропадать, но сразу не сообразил в чём прикол ;D

За разъяснение всем большое спасибо! :beer:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Yashied
а как быть в случаях, когда для разного рода ошибок устанавливаются разные @error, но при этом возвращается одно и то же значение?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Kaster сказал(а):
Yashied
а как быть в случаях, когда для разного рода ошибок устанавливаются разные @error, но при этом возвращается одно и то же значение?
Ну я же написал "по возможности"...
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
3 параметр функции SetError - это значение, которое вернёт эта самая функция SetError, а не та функция, в которой была вызвана SetError!
 
Автор
Garrett

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
kzru_hunter сказал(а):
3 параметр функции SetError - это значение, которое вернёт эта самая функция SetError, а не та функция, в которой была вызвана SetError!
Это вопрос? :smile:
Иначе читайте выше!
 

Aleksandr Prilutskiy

Знающий
Сообщения
29
Репутация
9
Re: SetError() не работает так, как заявлено в справке

Ни какой ошибки нет.
Само по себе SetError() не прерывает выполнение функции, а только присвистывает значения макросам @error и @extended.
Третий параметр в SetError() просто присваивает значение, которое будет возвращено после ее вызова.
Чтобы вернуть это значение из вызываемой функции нужно использовать Return SetError(...).
В твоем случае:
Код:
If ... Then Return SetError(1, 0, 500)

- SetError() сначала присваивает значения:
@error = 1
@extended = 0
и возвращает значение 500, которое Return возвращает в качестве результата выполнения функции.
Это аналогично:
Код:
If ... Then
 SetError(1, 0)
 Return 500
EndIf

только в одну строчку.
 

joiner

Модератор
Локальный модератор
Сообщения
3 352
Репутация
578
Re: SetError() не работает так, как заявлено в справке

OffTopic:
Aleksandr Prilutskiy
некропостинг... ;)
 
Верх