12
votes

Remplacer la page d'erreur sans défaut de Sinatra

Y a-t-il un moyen de remplacer la page d'erreur sans défaut de sinatra ("Sinatra ne connaît pas ce ditty")? Je veux que Sinatra ne montre que une chaîne ordinaire comme "méthode non trouvée" lorsqu'il n'a pas trouvé la voie appropriée, mais lorsque je soulevais une erreur 404 de l'intérieur d'un itinéraire, je souhaite qu'il affiche le message d'erreur transmis.

Implémentation du bloc Not_found comme ceci: p>

 get '/' do
    begin
      # some processing that can raise an exception if resource not found
    rescue => e
      error 404, e.message.to_json
    end
  end


0 commentaires

3 Réponses :


6
votes

Si vous n'utilisez pas de manipulation des erreurs dans votre itinéraire, vous pouvez utiliser l'erreur Erreur intégrée comme ceci (prise et modifiée à partir du SINATRA: up and exécuté livre) xxx

Il y a un paramètre capture qui tient votre erreur. Vous pouvez y accéder via paramètres ['captures'] . C'est un tableau et dans mes tests, il contiendrait un seul élément, qui était l'erreur elle-même (pas une chaîne).

Voici des informations sur l'objet de la demande.


5 commentaires

Je fonctionne, mais pas pour des itinéraires inégalés, donc si j'ai une application Sinatra comme celle que vous avez postée et essayez d'atteindre par exemple / this_is_not_a_present_route Je vois toujours la page de sinatra par défaut au lieu du message d'erreur.


Donc, si vous avez une demande d'itinéraire inexistante, utilisez l'itinéraire no_found . Dans l'objet de la demande, il y a demande.path qui vous donnerait 'this_is_not_a_present_route' dans votre exemple. J'ai mis à jour l'exemple aussi.


Bonjour, le problème est de ne pas remplacer les autres messages d'erreur 404 élevés des itinéraires intérieurs. De cette façon, il présentera toujours la requête.Path Si vous essayez d'atteindre un itinéraire non implémenté, mais vous le montrerez si une erreur 404 est relevée des itinéraires intérieurs.


Si vous soulevez une erreur de l'intérieur d'un itinéraire, vous ne devez pas renvoyer un 404, vous devez renvoyer un 500 ou même 503. 404 est pour le moment où l'URI demandée n'est pas trouvée.


Dans l'exemple, params ['captures'] ne contient pas d'exceptions ni de messages d'erreur. Il est renseigné avec les captures d'expression régulières s'ils sont spécifiés dans le chemin (c'est-à-dire obtenir% r {/ id / (\ d +)} dactez ). Donc, cette réponse est hors base. Utilisez env ['sinatra.error'] pour accéder à l'objet d'exception.



1
votes

Nevermind, a constaté que toutes les routes sont assorties dans l'ordre. Ainsi, après toutes les routes, je mets get / post / delete '*' '' '' fin et qui résout mon problème.


0 commentaires