Skip to content

Commit 431b8ac

Browse files
committed
Suppress exceptions with @ or @<class_list>
1 parent ed5ce99 commit 431b8ac

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+1353
-540
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
--TEST--
2+
Silencing a new object instance
3+
--FILE--
4+
<?php
5+
6+
class A {
7+
public function __construct() {
8+
throw new Exception();
9+
}
10+
}
11+
12+
$var = @new A();
13+
14+
var_dump($var);
15+
16+
echo "Done\n";
17+
?>
18+
--EXPECT--
19+
NULL
20+
Done
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--TEST--
2+
Suppression operator ParseError with empty class list
3+
--FILE--
4+
<?php
5+
6+
function test1() {
7+
throw new Exception();
8+
return true;
9+
}
10+
11+
$var = @<>test1();
12+
13+
var_dump($var);
14+
15+
echo "Done\n";
16+
?>
17+
--EXPECTF--
18+
Parse error: syntax error, unexpected token ">" in %s on line 8
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
Silence exception with @ operator
3+
--FILE--
4+
<?php
5+
6+
function test1() {
7+
throw new Exception();
8+
return true;
9+
}
10+
11+
$var = @test1();
12+
13+
var_dump($var);
14+
15+
echo "Done\n";
16+
?>
17+
--EXPECT--
18+
NULL
19+
Done
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--TEST--
2+
Use of @ before foreach value to iterator upon
3+
--FILE--
4+
<?php
5+
6+
function foo() {
7+
throw new Exception();
8+
}
9+
10+
foreach (@foo() as $val) {
11+
var_dump($val);
12+
}
13+
14+
echo "Done\n";
15+
?>
16+
--EXPECTF--
17+
Warning: foreach() argument must be of type array|object, null given in %s on line %d
18+
Done
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--TEST--
2+
Use of @ in try catch must not fail when a diagnostic is emitted
3+
--FILE--
4+
<?php
5+
6+
try {
7+
$var = @$non_existent;
8+
} catch (\Throwable $e) {
9+
echo $e::class, \PHP_EOL;
10+
}
11+
12+
var_dump($var);
13+
14+
echo "Done\n";
15+
?>
16+
--EXPECT--
17+
NULL
18+
Done
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--TEST--
2+
Use of @ in try catch must not fail when an exception is thrown
3+
--FILE--
4+
<?php
5+
6+
function test1() {
7+
throw new Exception();
8+
return true;
9+
}
10+
11+
try {
12+
$var = @test1();
13+
} catch (\Throwable $e) {
14+
echo $e::class, \PHP_EOL;
15+
}
16+
17+
var_dump($var);
18+
19+
echo "Done\n";
20+
?>
21+
--EXPECT--
22+
NULL
23+
Done
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
--TEST--
2+
Silencing an internal function argument emitting a diagnostic
3+
--FILE--
4+
<?php
5+
6+
var_dump(@$non_existent);
7+
8+
echo "Done\n";
9+
?>
10+
--EXPECT--
11+
NULL
12+
Done
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--TEST--
2+
Silencing an internal function argument throwing an Exception
3+
--FILE--
4+
<?php
5+
6+
function foo() {
7+
throw new Exception();
8+
return 1;
9+
}
10+
11+
var_dump(@foo());
12+
13+
echo "Done\n";
14+
?>
15+
--EXPECT--
16+
NULL
17+
Done
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
Suppression operator with class list, single
3+
--FILE--
4+
<?php
5+
6+
function test1() {
7+
throw new Exception();
8+
return true;
9+
}
10+
11+
$var = @<Exception>test1();
12+
13+
var_dump($var);
14+
15+
echo "Done\n";
16+
?>
17+
--EXPECT--
18+
NULL
19+
Done
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
Suppression operator should only suppress listed Exceptions
3+
--FILE--
4+
<?php
5+
6+
function test1() {
7+
throw new Error();
8+
return true;
9+
}
10+
11+
$var = @<Exception>test1();
12+
13+
var_dump($var);
14+
15+
echo "Done\n";
16+
?>
17+
--EXPECTF--
18+
Fatal error: Uncaught Error in %s:4
19+
Stack trace:
20+
#0 %s(8): test1()
21+
#1 {main}
22+
thrown in %s on line 4
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
--TEST--
2+
Nested at in call must not fail
3+
--FILE--
4+
<?php
5+
6+
function foo($arg) {
7+
}
8+
9+
function bar() {
10+
throw new Exception("test");
11+
}
12+
13+
try {
14+
$var = @foo(@bar());
15+
} catch (\Throwable $e) {
16+
echo $e::class, \PHP_EOL;
17+
}
18+
19+
var_dump($var);
20+
21+
echo "Done\n";
22+
?>
23+
--EXPECT--
24+
NULL
25+
Done
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
Silence function with ops before exception with @ operator
3+
--FILE--
4+
<?php
5+
6+
function test1() {
7+
$b = strlen("Hello");
8+
$a = 5;
9+
throw new Exception();
10+
$a += 25;
11+
return true;
12+
}
13+
14+
$var = @test1();
15+
16+
var_dump($var);
17+
18+
echo "Done\n";
19+
?>
20+
--EXPECT--
21+
NULL
22+
Done
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
Silence nested function call which throws with @ operator
3+
--FILE--
4+
<?php
5+
6+
function test1() {
7+
throw new Exception();
8+
return true;
9+
}
10+
11+
function test2($a) {
12+
$a += 6;
13+
return test1();
14+
}
15+
16+
$var = @test2();
17+
18+
var_dump($var);
19+
20+
echo "Done\n";
21+
?>
22+
--EXPECT--
23+
NULL
24+
Done
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
Multiple use of @ operator must not fail to suppress diagnostic
3+
--FILE--
4+
<?php
5+
6+
$var = @@$non_existent;
7+
8+
var_dump($var);
9+
10+
echo "Done\n";
11+
?>
12+
--EXPECT--
13+
NULL
14+
Done
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
Multiple use of @ operator must not fail to suppress diagnostic
3+
--FILE--
4+
<?php
5+
6+
function test1() {
7+
throw new Exception();
8+
return true;
9+
}
10+
11+
$var = @@test1();
12+
13+
var_dump($var);
14+
15+
echo "Done\n";
16+
?>
17+
--EXPECT--
18+
NULL
19+
Done
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
Silence throw with @ operator
3+
--FILE--
4+
<?php
5+
6+
$var = @throw new Exception();
7+
8+
var_dump($var);
9+
10+
echo "Done\n";
11+
?>
12+
--EXPECT--
13+
NULL
14+
Done
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
Silence undef variable with @ operator
3+
--FILE--
4+
<?php
5+
6+
$var = @$non_existent;
7+
8+
var_dump($var);
9+
10+
echo "Done\n";
11+
?>
12+
--EXPECT--
13+
NULL
14+
Done
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--TEST--
2+
Silencing a userland function argument emitting a diagnostic
3+
--FILE--
4+
<?php
5+
6+
function test1($arg) {
7+
return $arg;
8+
}
9+
10+
$var = test1(@$non_existent);
11+
12+
var_dump($var);
13+
14+
echo "Done\n";
15+
?>
16+
--EXPECT--
17+
NULL
18+
Done
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--TEST--
2+
Silencing a userland function argument throwing an Exception
3+
--FILE--
4+
<?php
5+
6+
function test1($arg) {
7+
return $arg;
8+
}
9+
10+
function foo() {
11+
throw new Exception();
12+
return 1;
13+
}
14+
15+
$var = test1(@foo());
16+
17+
var_dump($var);
18+
19+
echo "Done\n";
20+
?>
21+
--EXPECT--
22+
NULL
23+
Done

0 commit comments

Comments
 (0)