Что нового

Очень странная ошибка в использовании SetError()

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
The Dream [?]
Вот так : return setError (1,1,1) - будет макос @error ?
я не понял это предложение.
return seterror(1, 1, 1) - вернет значение 1, установит @extended на 1 и установит @error на 1. то есть, если ты вызовешь функцию, и проверишь потом значения функция и макросов, то получишь именно те значения, что установил.
Код:
$d = SomeFunc($a, $b, $c)
ConsoleWrite('Значение функции - ' & $d & @CRLF & 'Значение @error - ' & @error & @CRLF & 'Значение @extended - ' & @extended & @CRLF)
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Сreator - Я ПРОБЫВАЛ ВСЕ ЭТО,товарищи !

Все равно на выхоже - @error !



Код:
If pingEx($link_Home, 12000) <> 0 Then
												MsgBox (16,'','мы тут')
											EndIf


Func pingEx($link_, $time_ = 6000)

	$A = stringStripChars($link_, 'http://')
	If StringInStr($A, '/') Then
		$BS = StringSplit($A, '/')
		$B = $BS[1]
	Else
		$B = $A
	EndIf

	$resultPing = Ping($B, $time_)

    If $resultPing Then
        _GUICtrlRichEdit_AppendText($hRichEdit, '    pingEx -> successfully (' & $resultPing & ')' & @CRLF)
        Return $resultPing
    Else
        _GUICtrlRichEdit_AppendText($hRichEdit, '    pingEx -> error (' & $resultPing & ')' & @CRLF)
        Return SetError(1, 0, 0)
    EndIf

EndFunc   ;==>pingEx
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
The Dream
три раза перечитал твой первый пост, но так и не понял, чего ты добиваешься. ты можешь без фраз типа "что тут не так", "как быть в такой ситуации" и иже с ними, объяснить, что должно получится в итоге.
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Kaster,извини,просто я сам уже замучался.Посмотри мой предыдущий пост и пост Сreator-a.По его теории у меня все должно работать.Почему же у меня всегда возвразает @error ф-ция?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
The Dream [?]
Почему же у меня всегда возвразает @error ф-ция?
как ты это узнаешь? в том коде что ты привел, ты нигде не проверяешь значение @error.
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Специально для тебя Kaster, пример :

Код:
Func Func_A()
	$A = 0
    If $A = 1 Then
		Return SetError(1) ; Что это? мы же сюда не заходим!
	Else
		Return 0 ; если поставить 1 , то работает как нужно.Вопрос,почему? @error - это ноль?
	EndIf
EndFunc   ;==>Func_A

If Func_A() = @error Then
    MsgBox(16, '', '@error')
EndIf




Kaster,в предыдущем примере поставил проверку на @error - Тоже самое.

Код:
;...
     If pingEx($link_Home, 12000) <> @error Then
          ;...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Код:
If ProcessExists('AutoIt.exe') <> @error Then
	; это как я понимаю не правильно?
EndIf

If @error <> 0 Then
	; это как я понимаю правильно?
EndIf

If @error Then
	; это как я понимаю не правильно?
EndIf



Тогда,я расстроен...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
The Dream
обрамляй код тэгами.
по коду, ты путаешь возвращаемое значение функции и установка макросов @error функцией. я тебе выше уже писал, что одно не равно другому в понятийном плане. когда вызываешь функцию, создаются три объекта
1. то, что в return при определении функции, или 0, если return не было
2. @error. если использовал seterror, то это значение, если нет, то 0
3. @extended. если использовал setextended или второй параметр seterror, то это значение. если нет, то 0
то есть, каждый раз когда ты вызываешь функцию, эти значения заполняются. и проверять равенство одного из них другому неверный подход, а следовательно
Код:
If Func_A() = @error Then

бессмысленно. я тебя уже три раза спросил что ты хочешь получить, а ты все время ссылаешься на свой код. макрос @error предназначен для идентификации разного рода ошибок, чтобы во время сбоя функции ты знал – какая именно ошибка произошла. поэтому проверяют значение самого макроса, а не значение функции. как правило для формирования ошибок, значение функции выставляют равным одному и тому же нетипичному значению. если хочешь пример, то вот простейшая реализация
Код:
Func SomeFunc($a = 1, $b = 2, $c = 3)
    If $a < 1 Then Return SetError(1, 0, -1)
    If $b < 2 Then Return SetError(2, 0, -1)
    If $c < 3 Then Return SetError(3, 0, -1)
    Return ($a + $b + $c)/3
EndFunc

в этом примере есть некоторая функция, которая ВОЗВРАЩАЕТ значение, т.к. при любом исходе сработает один из Return'ов. НО, у функции есть три исключительных варианта.
1. первый параметр не может быть меньше 1, если вдруг окажется что меньше, то функция вернет условно "нетипичное" значение -1 и установит макрос @error в значение 1, то есть если ты хочешь узнать не произошел ли этот ошибочный вариант, то должен проверить @error = 1.
2. аналогично со вторым параметром, только @error установится в значение 2
3. @error установится в значение 3.
то есть, после вызова функция сначала проверит три своих параметра на "неверность" значений. если все ок, то вернет тебе их среднее. если же не все ок, то вернет -1 и поменяет @error. для того, чтобы узнать что конкретно произошло, ты должен проверить этот @error, для этого он и нужен.
Код:
Func SomeFunc($a = 1, $b = 2, $c = 3)
    If $a < 1 Then Return SetError(1, 0, -1)
    If $b < 2 Then Return SetError(2, 0, -1)
    If $c < 3 Then Return SetError(3, 0, -1)
    Return ($a + $b + $c)/3
EndFunc

$d = SomeFunc(2, 3, 4)
If @error = 1 Then
    MsgBox(0, '', 'Ой, кажется первый параметр меньше 1. Ошибка')
ElseIf @error = 2 Then
    MsgBox(0, '', 'Ой, кажется второй параметр меньше 2. Ошибка')
ElseIf @error = 3
    MsgBox(0, '', 'Ой, кажется третий параметр меньше 3. Ошибка')
Else
    MsgBox(0, '', 'Все нормально, среднее значение введенных параметров ' & $d)
EndIf

поэкспериментируй с разными входными данными для SomeFunc и увидишь который из msgbox'ов сработает
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Kaster,завтра прочитаю твой ответ - очень спать хочу..

Даже в закладки поставил,спасибо за доходчивость,я уже понял к чему ты ))

Лично к тебе вопрос,как думаешь проверять тогда,возвращает функция True / False ? Я имею ввиду эстетично ли это будет смотрется ? Мне твой ответ на это сообщение - будет также очень интересным и полезным.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
The Dream
тут дело не в эстетике, а в конкретной задаче. если тебе достаточно только знать, сработало ли что-то или нет, то достаточно. если тебе важно знать, что конкретно вернула функция, то конечно мало. нужно больше степеней свободы.
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Тогда вот вопрос.Как тогда сделать,чтобы при успехе просто условие сработало ( без проверок ) , а при неудаче - условие else.

Пример :

Код:
If ProcessExists(@AutoItExe) Then
	;..
Else
	;..
EndIf
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
переношу тему в общение.
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Kaster,а в макросе @error при ошибке - будет информация о том,какая -ф-ция,какая ошибка (просто читал твой ответ*),код ошибки ? или просто флаг?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
The Dream
там будет ровно то, что ты укажешь в SetError, ну или то, что указано в справке, если функция нативная.
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Прошу прощения,что надоедаю.Но еще раз.То есть каждая ф-ция в себе имеет по-умолчанию уже setError (мы его не видим), который имеет "дефолтное" значение - 0 . И при вызове любой ф-ции в макрос записывается значение - или ошибка или ноль,что говорит о том,что ошибок нет.Верно? Тоесть @error как контейнер самый глобальный,в который помещается результат - только ошибка,или нет,и все.Резултат ф-ции там конечно не будет )
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Почему так не работает как нужно :


Код:
If IniRead(@ScriptDir & '\...','...','...',0) <> 0 Then
	MsgBox (16,'','прочитали')
Else
	MsgBox (16,'','не прочитали')
EndIf



А если заменить 0 на '0',что работает отлично.Кому интересно,можете проверить даже)




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

Давайте,разберемся,господа!
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
The Dream [?]
Почему так не работает как нужно
Потому что IniRead возвращает строковый тип.

P.S
К теме это уже не относится.
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Теперь понятно,спасибо большое.

К теме не относится...но близко,в любом случае,у меня этот вопрос возник в следствии предыдущего.
 
Верх