Что нового

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

The Dream

Новичок
Сообщения
393
Репутация
3
Есть ф-ция.В любом случае,она возвращает ошибку.Я уже два часа не могу понять в чем загвоздка.


Код:
Func navigate($comment, $obj, $link, $intermediateBlank = 1)

	Local $intermediate
	If $intermediateBlank = 1 Then
		$intermediate = _IENavigate($obj, 'about:blank', 1)
	EndIf

	If $intermediateBlank = 0 Then
		$intermediate = -1
	EndIf

	If $intermediate = -1 Then
		If _IENavigate($obj, $link, 0) = -1 Then
			$loadWait = _IELoadWait($obj, 0, $timeWaitDefault)
			If $loadWait = 1 Or $loadWait = 6 Then
				$A = TimerInit()
				While 1
					If waitingString($obj, 'DATABASE ERROR') = 0 _
							And waitingString($obj, 'MySQL error: 1203') = 0 _
							And waitingString($obj, 'fatal error') = 0 _
							And waitingString($obj, 'SQL ERROR') = 0 Then ExitLoop
					_IEAction($obj, 'refresh')
					_IELoadWait($obj, 0, $timeWaitDefault)
					If $timeWaitDefault < TimerDiff($A) Then ExitLoop
					Sleep(1000)
				WEnd
				_GUICtrlRichEdit_AppendText($hRichEdit, '    navigate (' & $link & ') -> successfully (' & $comment & ')' & @CRLF)
			Else
				_GUICtrlRichEdit_AppendText($hRichEdit, '    navigate (' & $link & ') -> error (' & $comment & ')' & @CRLF)
				Return SetError(1)
			EndIf
		EndIf
	EndIf


EndFunc   ;==>navigate




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

Проблему почти решил,но остался вопрос ,
Код:
Return SetExtended(0)
всегда нужно использовать в таком случае?


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

Вроде бы разобрался.Но как быть в такой ситуации :


Код:
If StringInStr($linkPic, 'picsee') Then
		Return $linkPic
	Else
		Return SetError(1)
	EndIf
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
The Dream [?]
Но как быть в такой ситуации
Попробуйте так:
Код:
;...
If StringInStr($linkPic, 'picsee') Then
	Return SetError(0, 0, $linkPic)
Else
	Return SetError(1, 0, '')
EndIf
;...
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
И тогда на выходе не будет разве макрос @error ???
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
The Dream
Код:
For $i = 1 To 5
	ConsoleWrite('----' & @LF)
	$sRes = _Test_Func('picsee')
	ConsoleWrite($sRes & ': picsee, Error:' & @TAB & @error & @LF)
	$sRes = _Test_Func('No')
	ConsoleWrite($sRes & ': No, Error:' & @TAB & @error & @LF)
Next

Func _Test_Func($s_LinkPic)
	If StringInStr($s_LinkPic, 'picsee') Then
		Return SetError(0, 0, $s_LinkPic)
	Else
		Return SetError(1, 0, 'НЕТ')
	EndIf
EndFunc   ;==>_Test_Func
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Зачем при истине - возвращать @error ? У меня условие проверяется на @error в программе...понимаете..)

А так я могу просто return-ом обойтись...

Просто нужно,чтобы в случае ошибки - возвращался @error.А в случае истины - ничего,пустота,но только не @error.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
The Dream,
Так понятнее?
Код:
$sRes = _Test_Func('picsee')
If @error Then
	MsgBox(16, 'Error', @error)
Else
	MsgBox(64, 'Info', $sRes)
EndIf
$sRes = _Test_Func('No')
If @error Then
	MsgBox(16, 'Error', @error)
Else
	MsgBox(64, 'Info', $sRes)
EndIf

Func _Test_Func($s_LinkPic)
	If StringInStr($s_LinkPic, 'picsee') Then
		Return SetError(0, 0, $s_LinkPic)
	Else
		Return SetError(1, 0, 'НЕТ')
	EndIf
EndFunc   ;==>_Test_Func
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
тогда,как я правильно понял,у SetError есть два параметра - 0 и 1 ? 1 - ошибка,0 - нет?



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

Прошу прощения,просто я ...и подумать не мог,что 0 - это уже в системе,вернее в setError предусмотрено как нет ошибок ! Я думал,что SetError - просто устанавливает ОШИБКУ (макрос) с КОДОМ (в случае ложного условия).


Мда....жалко очень..два часа выкинул на ветер..


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

А эта ф-ция , чтото не работает....бред какойто получается дальше...



Код:
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 SetError(0,0,$resultPing)
	Else
		_GUICtrlRichEdit_AppendText($hRichEdit, '    pingEx -> error (' & $resultPing & ')' & @CRLF)
		Return SetError(1)
	EndIf

EndFunc   ;==>pingEx



Наверно уйду я от этого setError и буду пользоваться False/True
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А что тут непонятного? При выходе из функции можно вернуть какое-нибудь значение с помощью Return (по умолчанию 0) + можно установить два флага - @error и @extended, если конечно они нужны.

Код:
Func A()
EndFunc

Func B()
	Return 1
EndFunc

Func C()
	Return SetError(2, 3, 1)
EndFunc

$Result = A()
ConsoleWrite('A(): Result = ' & $Result & '   @error = ' & @error & '   @extended = ' & @extended & @CR)

$Result = B()
ConsoleWrite('B(): Result = ' & $Result & '   @error = ' & @error & '   @extended = ' & @extended & @CR)

$Result = C()
ConsoleWrite('C(): Result = ' & $Result & '   @error = ' & @error & '   @extended = ' & @extended & @CR)


Обычно делают так:

Код:
Func A()

	...

	If "Ошибка" Then
		Return SetError(1, 0, 0) ; "Результат" = 0, т.к. третий параметр равен 0, @error = 1 (первый параметр), @extended = 0 (второй параметр)
	Else
		Return 17 ; "Результат" = 17, @error и @extended не используются и будут равны 0
	EndIf
EndFunc

$Result = A()
If @error Then
	ConsoleWrite('Ошибка!!!' & @CR)
Else
	ConsoleWrite('Не ошибки, Result = ' & $Result & @CR)
EndIf
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Yashied , тогда почему в ф-циях это не рабоает? особенно во втором примере,там же все прозрачно,но что и в первом - всегда возвращается ошибка...(макрос @error)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
The Dream [?]
А эта ф-ция , чтото не работает
А зачем Вам из функции pingEx() возвращать @error ?
Код:
Dim $aURL[5] = [4, 'http://autoit-script.ru/', 'http://forum.oszone.net/forum-103.html', 'http://www.google.ru/', _
		'http://No-autoit-script.ru/'];последний URL - несуществующий

For $i = 1 To $aURL[0]
	$iPing = _PingEx($aURL[$i])
	If $iPing Then
		ConsoleWrite('Ping: ' & $iPing & ' ---> Host is online' & @LF)
	Else
		ConsoleWrite('---> Error' & @LF)
	EndIf
	Sleep(3000)
Next

Func _PingEx($s_URL, $i_Timeout = 4000)
	Local $i_Ping, $s_Host, $a_Message = 'Host is online'

	$s_Host = StringRegExpReplace($s_URL, '.*://(.*?)/.*', '\1')
	$i_Ping = Ping($s_Host, $i_Timeout)
	If Not $i_Ping Then $a_Message = 'Error'
	;вместо _GUICtrlRichEdit_AppendText()
	ToolTip(StringFormat('%s:\t\tping: %d ---> %s', $s_Host, $i_Ping, $a_Message), 0, 0)
	Return $i_Ping
EndFunc   ;==>_PingEx
 

kaster

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

The Dream

Новичок
Сообщения
393
Репутация
3
"Зачем при истине - возвращать @error ? У меня условие проверяется на @error в программе...понимаете..)

А так я могу просто return-ом обойтись...

Просто нужно,чтобы в случае ошибки - возвращался @error.А в случае истины - ничего,пустота,но только не @error.
"


:whistle:


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

Посмотри пожалуйста,что это может быть.Ф-ция pingEx,что я выше привел.В случае ошибки - return 0,в случае успеха - return <значение ф-ции> (время пинга) .

Так в любом случае,это условие - срабатывает :


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

kaster

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


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

The Dream
у тебя не работает, потому что у тебя возвращается Return SetError(число), то есть возвращается значение, которое в свою очередь возвращает SetError. Но SetError, если у него не указан третий параметр, не будет ничего возвращать. Стало быть Return тоже ничего не вернет. а лишь установит макрос. поэтому, указывай третий параметр, если помимо установок макроса хочешь чтобы возвращалось значение
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
А чтобы просто возвращался флаг/макрос @error ?

нужно setError(1,1,1) (допустим..)
 

kaster

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

The Dream

Новичок
Сообщения
393
Репутация
3
Вот так : return setError (1,1,1) - будет макос @error ?


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

Я все правильно понимаю??

Код:
Func Func_A()
	Return SetError(1, 1, 1) ; посередине,я могу указать саму ошибку ? тоесть любое значение,например "подробная ошибка:... " , верно?
EndFunc   ;==>Func_A

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

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
The Dream
Код:
For $i = 1 To 10
	$sRes = _TestFunc()
	MsgBox(64, 'Info ' & $i, '@error = ' & @error & @LF & '@extended = ' & @extended & @LF & '$sRes = ' & $sRes)
Next

Func _TestFunc()
	Local $s_Return_String, $i_Len
	$i_Len = Random(5, 50, 1)
	For $i = 1 To $i_Len
		$s_Return_String &= Chr(Random(97, 122, 1)) ;a-z
	Next
	;SetError(целое число, целое число, любое значение)
	Switch $i_Len
		Case 5 To 10
			Return SetError(0, $i_Len, $s_Return_String)
		Case 11 To 20
			Return SetError(0, $i_Len, $s_Return_String)
		Case 21 To 30
			Return SetError(-22, $i_Len, $s_Return_String)
		Case 31 To 40
			Return SetError(333, $i_Len, $s_Return_String)
		Case 41 To 50
			Return SetError(-9000, $i_Len, $s_Return_String)
	EndSwitch
EndFunc   ;==>_TestFunc
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Блин,капец.Прям не знаю что делать.

Есть ф-ция,еще раз ее приведу :


Код:
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)
		; тут успех
	Else
		_GUICtrlRichEdit_AppendText($hRichEdit, '    pingEx -> error (' & $resultPing & ')' & @CRLF)
                ; тут ошибка
	EndIf

EndFunc   ;==>pingEx


Как в ней прописать setError так,чтобы при ошибки (return setError(1)) - возвращался макрос @error ,а при успехе - просто время (return $resultPing) (в скобках я поставил свой вариант,который.... ни каким образом не работает.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
The Dream [?]
Как в ней прописать setError так,чтобы при ошибки (return setError(1)) - возвращался макрос @error ,а при успехе - просто время (return $resultPing)

Код:
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



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

P.S
А что за stringStripChars?
 
Верх