Tools::catchError() resp. Debug::catchError() odchytává chyby předřazené zavináčem @

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Milo
Nette Core | 1283
+
0
-

Nette v0.9

Tools::tryError();
@fopen( 'nonExists' );
Tools::catchError($msg); // odchytne chybu

// Oprava Tools.php
public static function _errorHandler($code, $message)
{
    if( error_reporting() == 0 ) return;
    ...
}

Nette v2.0

Debug::tryError();
@fopen( 'nonExists' );
Debug::catchError($msg); // odchytne chybu

// Oprava Debug.php
Nevim, tam se s error_reporting() značně manipuluje.
arron
Člen | 464
+
0
-

Mam takovy dojem, ze tohle ridi promena Debug::$scream. Jestli jsem spravne pochopil, tak nastavena na FALSE by nemela delat nic, nastavena na TRUE by mela zapricinit to, ze i se @ se vyhodi chyba.

Milo
Nette Core | 1283
+
0
-

Debug::$scream metodu Debug::catchError() nijak neovlivní.

David Grudl
Nette Core | 8228
+
0
-

Podle me je nové chování lepší. Proč bych měl vůbec v tryError … catchError používat zavináč?

Milo
Nette Core | 1283
+
0
-

Přímo se to asi nepoužije. Já ho použil ve __wakeUp() metodě a při session_start() byla chyba odchycena. Očekával bych, že @ warningy odchyceny nebudou.

Proč se vlastně u session_start() nekontroluje návratová hodnota?

David Grudl
Nette Core | 8228
+
0
-

Už tomu rozumím, zavináčová chyba se ochytne, ačkoliv by neměla. To by se asi mohlo opravit.

Návratová hodnota se netestuje, protože vrací vždycky TRUE.

Jan Tvrdík
Nette guru | 2595
+
0
-

David Grudl napsal(a):

Návratová hodnota se netestuje, protože vrací vždycky TRUE.

Podle dokumentace by měla funkce session_start vracet od PHP 5.3 i FALSE.

David Grudl
Nette Core | 8228
+
0
-

Jasně, ale pro PHP 5.2 se tím nic nemění a co jsem zkoušel, v PHP 5.3 vrací true taky.

Milo
Nette Core | 1283
+
0
-

David Grudl napsal(a):
Návratová hodnota se netestuje, protože vrací vždycky TRUE.

Aha, tak toho jsem si nevšimnul.

Už tomu rozumím, zavináčová chyba se ochytne, ačkoliv by neměla. To by se asi mohlo opravit.

Bude to asi větší zásah, protože tryError() nastavuje error_reporting(0). Něco ve smyslu Tools:

public static function tryError()
{
	self::$catchMode = true;
	self::$catchedMessage = "";
}

public static function catchError( &$msg )
{
	self::$catchMode = false;
	if( self::$catchedMessage != "" )
	{
		$msg = self::$catchedMessage;
		return true;
	}

	return false;
}

public static function _errorHandler($severity, $message, $file, $line, $context)
{
	if( self::$catchMode )
	{
		if( error_reporting() != 0 )
		{
			self::$catchedMessage = $message; // if 0, line was @ prefixed
		}
		return;
	}
	...
	...
}

Editoval Milo (11. 10. 2010 11:21)