Автор Тема: SetError() не работает так, как заявлено в справке.  (Прочитано 9165 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 961
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
По идеи как я понял из справки SetError() не только должна возвратить три параметра (два из них опционально) но и перекрыть возвращаемое функцией значение, если указан третий параметр.
Но, вот пример:
Код: AutoIt [Выделить]
$Result = test()
ConsoleWrite("Error: " & @error & @CRLF & "Extended: " & @extended & @CRLF & "Value: " & $Result & @CRLF)
Func test()
    SetError(1, 10, 500)
EndFunc
 

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

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

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

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

Скорблю и помню.




Русское сообщество AutoIt

SetError() не работает так, как заявлено в справке.
« Отправлен: Август 06, 2010, 03:47:28 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2696
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Не баг.

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

Код: AutoIt [Выделить]
ConsoleWrite(SetError(1, 10, 500) & @CR)


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

Код: AutoIt [Выделить]
Return SetError(1, 10, 500)


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

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

Код: AutoIt [Выделить]
Func test()
    SetError(1, 10)
    Return 500
EndFunc


Цитировать
Танцуют все...


Думай, прежде чем говорить.

Оффлайн SyDr [?]

  • Локальный модератор
  • *
  • Сообщений: 649
  • Репутация: 157
  • Пол: Мужской
  • Сидра
    • Награды
  • Версия AutoIt: 3.3.12.0
Уже расписали, ну да ладно:
Garrett  [?]
Цитировать
но и перекрыть возвращаемое функцией значение, если указан третий параметр.
Как написано, так и делает :)
Параметры
return value [optional] Override the default return value and return this parameter.
Перекрывает возвращаемое значение по умолчанию (самой функции SetError, а не какой-либо другой функции) и возвращает этот параметр.

Оффлайн FlatX007 [?]

  • Осваивающий
  • **
  • Сообщений: 174
  • Репутация: 33
  • Пол: Мужской
  • Tattoo!
    • Награды
ещё так можно

Код: AutoIt [Выделить]
Func _1()
   
    If SetError(1, 0, 1) Then Return 1
   
EndFunc

...что можно узнать статус выполнения другой функции если в ней не включена возможность об отчете о том что она делает до того момента как она отработает

Русское сообщество AutoIt

Re: SetError() не работает так, как заявлено в справке.
« Ответ #3 Отправлен: Август 06, 2010, 12:04:55 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2696
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
ещё так можно

Код: AutoIt [Выделить]
Func _1()
   
    If SetError(1, 0, 1) Then Return 1
   
EndFunc


:blink:

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

Код: AutoIt [Выделить]
If 1 Then
    Return SetError(1, 0, 1)
EndIf


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

Код: AutoIt [Выделить]
Return SetError(1, 0, 1)


Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999

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

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

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2696
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
>"C:\Program Files\AutoIt3\autoit3.exe" /ErrorStdOut "E:\Desktop\New AutoIt v3 Script.au3"   
500
>Exit code: 0    Time: 0.490

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999

  • Автор темы
  • Репутация: 961
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
>"C:\Program Files\AutoIt3\autoit3.exe" /ErrorStdOut "E:\Desktop\New AutoIt v3 Script.au3"   
500
>Exit code: 0    Time: 0.490
Опа! Тогда ой, буду искать причину у себя :(



Добавлено: Август 06, 2010, 13:41:09
Нужно писать так:
Код: AutoIt [Выделить]
Return SetError(1, 0, 1)

То есть Return всё же необходим перед SetError!
Потому как первое и второе значения SetError возвращаются без Return, а вот третье только с Return!
Спасибо Yashied! :ok:
Спасибо Всем!
« Последнее редактирование: Август 06, 2010, 14:57:01 от Garrett, Причина: Объединение сообщений »

Русское сообщество AutoIt

Re: SetError() не работает так, как заявлено в справке.
« Ответ #7 Отправлен: Август 06, 2010, 13:26:32 »

Оффлайн SyDr [?]

  • Локальный модератор
  • *
  • Сообщений: 649
  • Репутация: 157
  • Пол: Мужской
  • Сидра
    • Награды
  • Версия AutoIt: 3.3.12.0
Garrett  [?]
Цитировать
Потому как первое и второе значения SetError возвращаются без Return, а вот третье только с Return!
Первое и второе значения не возвращаются! И пользовательская функция возвращает значение только через Return. Никакие другие функции для этого не предназначены.

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

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2696
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Потому как первое и второе значения SetError возвращаются без Return...
@error и @extended не возвращаются функцией, а устанавливаются. Функция может явно возвращать только один параметр, через Return. А @error и @extended, это просто глобальные переменные для контроля ошибок, которые устанавливают большинство функций AutoIt. И для пользователя тоже предоставили такую возможность, чере функцию SetError() / SetExtended(). Причем, проверять значения этих переменных нужно сразу же после выполнения той или иной функции. Следующая проверка будет неверной:

Код: AutoIt [Выделить]
$Label = DriveGetLabel('C:\')
ConsoleWrite($Label & @CR)
If @error Then
    ; Ошибка!
EndIf


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

Код: AutoIt [Выделить]
$Type = DriveGetType('C:\')
...
If Not $Type Then
    ; Ошибка!
EndIf

« Последнее редактирование: Август 06, 2010, 17:33:19 от Yashied »

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999

  • Автор темы
  • Репутация: 961
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Yashied
Я уже разобрался, спасибо! :ok:

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

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

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

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

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Yashied
а как быть в случаях, когда для разного рода ошибок устанавливаются разные @error, но при этом возвращается одно и то же значение?
Конференция посвященная AutoIt на jabber.ru - [email protected]
Как попасть на конференцию читаем тут


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2696
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Yashied
а как быть в случаях, когда для разного рода ошибок устанавливаются разные @error, но при этом возвращается одно и то же значение?

Ну я же написал "по возможности"...

Оффлайн kzru_hunter [?]

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

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999

  • Автор темы
  • Репутация: 961
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
3 параметр функции SetError - это значение, которое вернёт эта самая функция SetError, а не та функция, в которой была вызвана SetError!
Это вопрос?  :)
Иначе читайте выше!

Русское сообщество AutoIt

Re: SetError() не работает так, как заявлено в справке.
« Ответ #14 Отправлен: Август 07, 2010, 21:21:43 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
36 Ответов
26046 Просмотров
Последний ответ Ноябрь 20, 2012, 21:05:53
от djasup
 Закреплено  Ещё раз о русской справке :)

Автор SyDr « 1 2 ... 16 17 » Общение

248 Ответов
130153 Просмотров
Последний ответ Май 18, 2012, 00:27:17
от CreatoR
0 Ответов
4229 Просмотров
Последний ответ Август 24, 2010, 20:32:04
от snoitaleR
38 Ответов
12130 Просмотров
Последний ответ Август 27, 2011, 15:09:50
от Zalman1980
0 Ответов
1840 Просмотров
Последний ответ Август 26, 2011, 21:09:41
от Kaster
0 Ответов
3155 Просмотров
Последний ответ Сентябрь 01, 2011, 17:27:19
от dwerf
1 Ответов
2163 Просмотров
Последний ответ Май 18, 2012, 06:34:28
от sngr
1 Ответов
980 Просмотров
Последний ответ Февраль 25, 2016, 00:19:25
от alex33
2 Ответов
1169 Просмотров
Последний ответ Май 25, 2017, 23:35:04
от Garrett
3 Ответов
424 Просмотров
Последний ответ Февраль 21, 2018, 13:18:29
от hedji