English 中文(简体)
Separating Business Layer Errors from API errors
原标题:

The title is horrible, i know; I m terrible at titles on SO here.

I m wondering what would be the best way to present unified error responses in a webapi when errors could be raised deep inside the application.

The errors deep down in the app don t know anything about the web layer (nor should they), so how can the web layer classify myapp.PermissionError into a 403, json.DecodeError into a 400, myapp.driver.InvalidValue into 500, etc.

I have a few ideas, but I m not a big fan of any of them.

(As the snippets might imply, this is a python app on linux)

  1. Use a lot of except blocks to match the exception type i want. This is what i m currently doing but its growing unwieldy (i m already up to 8, and there are plenty more to go).

    try
      business.DoIt()
    except DecodingError:
      respond(400)
    except PermissionError:
      response(403)
    ...etc...
    
  2. Creating a mapping or list of exception types and map them to response codes. This doesn t seem much better than (1) in the end, but it does clean up the code.

    error_map = [(DecodingError, 400), (PermissionError, 403)]
    try:
      DoIt()
    except Exception, exc:
      for type, code in error_map:
        if isinstance(exc, type):
           response(code)
           return
    
  3. Add an interface to every exception class that provides the response code, but I don t like this because then the exceptions are carrying web-layer specific information (even if they live deep down in a driver that doesn t care about the web layer at all). I do like how "automatic" the web error response is, though.

    class PermissionError(Exception):
      web_status_code = 403
    try:
      Doit()
    except:
      response(exc.web_status_code)
    
最佳回答

I like option 1. It may be a little more verbose, but it s also very clear.

Option 2 separates the point at which the exception is thrown from where the decision about what to do with it is made. In reality, that likely wouldn t be too much of an issue, but why split it up if you don t have to?

I agree that option 3 is pretty ugly. No need to deal with the error behavior at that level, just throw the exception.

问题回答

暂无回答




相关问题
Can Django models use MySQL functions?

Is there a way to force Django models to pass a field to a MySQL function every time the model data is read or loaded? To clarify what I mean in SQL, I want the Django model to produce something like ...

An enterprise scheduler for python (like quartz)

I am looking for an enterprise tasks scheduler for python, like quartz is for Java. Requirements: Persistent: if the process restarts or the machine restarts, then all the jobs must stay there and ...

How to remove unique, then duplicate dictionaries in a list?

Given the following list that contains some duplicate and some unique dictionaries, what is the best method to remove unique dictionaries first, then reduce the duplicate dictionaries to single ...

What is suggested seed value to use with random.seed()?

Simple enough question: I m using python random module to generate random integers. I want to know what is the suggested value to use with the random.seed() function? Currently I am letting this ...

How can I make the PyDev editor selectively ignore errors?

I m using PyDev under Eclipse to write some Jython code. I ve got numerous instances where I need to do something like this: import com.work.project.component.client.Interface.ISubInterface as ...

How do I profile `paster serve` s startup time?

Python s paster serve app.ini is taking longer than I would like to be ready for the first request. I know how to profile requests with middleware, but how do I profile the initialization time? I ...

Pragmatically adding give-aways/freebies to an online store

Our business currently has an online store and recently we ve been offering free specials to our customers. Right now, we simply display the special and give the buyer a notice stating we will add the ...

Converting Dictionary to List? [duplicate]

I m trying to convert a Python dictionary into a Python list, in order to perform some calculations. #My dictionary dict = {} dict[ Capital ]="London" dict[ Food ]="Fish&Chips" dict[ 2012 ]="...

热门标签