#exceptionmapper
Explore tagged Tumblr posts
Text
JAX-RS ExceptionMapper
maps rest exceptions to responses.
0 notes
Video
youtube
Here's a quick Struts 2 example that looks at how to handle Struts exceptions with annotations and the ExceptionMapper in your Action classes. It's time to revisit the Apache Struts framework. #Java #JavaEE #JakartaEE #Tomcat #TomEE #EclipseIDE
0 notes
Text
Python の WSGI で JAX-RS の例外マッパーを実装してみる
Java の JAX-RS (JSR311, JSR339) にある例外マッパーが好き。例外マッパーでは、ハンドリングされない例外を一カ所でまとめてつかまえて、レスポンスに変換できる。
Python でも似たようなことができたら良いなと思ったから、なんとなくやっつけで作ってみた。インターフェースはとりあえず WSGI で。
#!/usr/bin/env python # -*- coding: utf-8 -*- from wsgiref.simple_server import make_server from functools import wraps class ExceptionMapper(object): def __init__(self, handlers): self.handlers = handlers def trap(self, function): @wraps(function) def _trap(*argv, **keywords): try: return function(*argv, **keywords) except BaseException, ex: environ, start_response = argv return self._handle(ex, environ, start_response) return _trap def _handle(self, ex, environ, start_response): while True: handler = self.handlers.get(ex.__class__) if handler is not None: return handler(ex, environ, start_response) ex = ex.__class__.__bases__[0] if ex == object: return self._sentinel(ex, environ, start_response) def _sentinel(self, ex, environ, start_response): start_response('500 Internal Server Error', [('Content-Type', 'text/plain')]) return ['Internal Server Error'] def io_error(ex, environ, start_response): start_response('503 Service Unavailable', [('Content-Type', 'text/plain')]) return ['Service Unavailable'] def name_error(ex, environ, start_response): start_response('404 Not Found', [('Content-Type', 'text/plain')]) return ['Not Found'] handlers = {IOError: io_error, NameError: name_error } mapper = ExceptionMapper(handlers) @mapper.trap def application(environ, start_response): raise IOError() if __name__ == '__main__': server = make_server('', 8080, application) server.serve_forever()
ExceptionMapper のオブジェクトを作って、デコレータで例外ハンドリングをまかせたい関数を登録していく。ExceptionMapper を作るときには、ハンドルしたい例外とハンドルするための関数をあらかじめ辞書で渡す。対象の関数で例外が上がったときには、その例外に登録されているハンドル用の関数か、またはその例外の親クラスに対して登録されているハンドル用の関数が呼び出される。
application の中に例外処理をずらずら並べるより、随分すっきりするでしょ?���外と便利そうな気はしてる。
0 notes