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

Milo
Moderator | 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
Moderator | 1283
+
0
-

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

David Grudl
founder | 8310
+
0
-

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

Milo
Moderator | 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
founder | 8310
+
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
founder | 8310
+
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
Moderator | 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)

RSS tématu Téma zavřeno