2017-04-14 5 views
0

Ok, je suis très confus. J'utilise le cadre Slim et je suit le code:PHP essayer attraper sauter catch, directement sauter dans enfin

1 $app->post("/user/login", function (Request $request, Response $response) { 
2 $resp = null; 
3 try { 
4  if (!array_key_exists("password", $request->getParams()) || !array_key_exists("username", $request->getParams())) { 
5   throw new LiberInvalidRequestException("Not all required parameters were passed."); 
6  } 
7  $user = new User($this->db, [ 
8   'username' => $request->getParam('username'), 
9   'password' => $request->getParam('password') 
10  ]); 
11  try { 
12   $resp['logincode'] = $user->login(); 
13   $resp['success'] = true; 
14  } catch (LiberAuthenticationException $exception) { 
15   $resp['success'] = false; 
16   $resp['errormessage'] = $exception->getMessage(); 
17  } 
18 } catch (LiberInvalidRequestException $exception) { 
19  $resp['success'] = false; 
20  $resp['errormessage'] = $exception->getMessage(); 
21 } finally { 
22  return $response->withJson($resp); 
23 } 
24 }); 

Quand j'appelle cette voie avec les bons params i obtenir une réponse null. À mon avis, cela ne devrait pas être possible car, de toutes les manières possibles, quelque chose est assigné à $resp. Quand je passe cette fonction avec le débogueur je peux aller jusqu'à la ligne 12 puis le débogueur saute au bloc finally (ligne 22).

Comment est-ce encore possible? L'exécution ne devrait-elle pas continuer ou aller au bloc catch?

+0

Il est possible que des exceptions autres que 'LiberAuthenticationException' ou' LiberInvalidRequestException' soient levées ... des problèmes d'espace de noms peuvent survenir? – deceze

+0

@deceze Je ne pense pas qu'une autre exception soit levée. J'ai découvert que le point où l'exécution saute au bloc finally est une instruction include dans le chargeur automatique du composeur. Les instructions Include ne lancent pas Exceptions IIRC. – Aaronmacaron

+0

Un 'try' dans un' try' ne ferait qu'ajouter à la confusion. S'il vous plaît voir [this] (http://stackoverflow.com/q/8439581/2298301) post sur la façon dont plusieurs blocs 'catch' pourraient être écrits pour un seul' try' - si nécessaire. –

Répondre

0

Ok, j'ai trouvé la solution au problème. Comme @deceze a dit qu'il y avait une exception levée que le bloc catch n'a pas attrapé. Depuis que j'utilise PHP7.1, les instructions include peuvent lancer des exceptions. C'est la raison pour laquelle une exception a été lancée en premier lieu.