Modern APIs with FastAPI and Python Transcripts
Chapter: Error handling and performance
Lecture: Error responses
Login or
purchase this course
to watch this video and the rest of the course contents.
0:00
Well, our weather API works.
0:01
We can come over here and click this.
0:03
Get a nice result here, nice response.
0:06
However, what happens if there's the smallest of mistake?
0:09
Like we misspell Portland to Portlnad.
0:14
That doesn't seem right. So we probably shouldn't be getting a server crash 500 server
0:19
error message when really what happened was there's just no city named Portlnad.
0:24
So let's go fix that. So what's happening is we're getting some response back,
0:29
and it's just raising a standard exception.
0:31
So let's go and add a little bit more information here. We'll go over here and
0:36
add a validation. We'll have a class,
0:41
which is a validation error, that derives from exception.
0:47
And let's give it actually a couple of things.
0:48
Let's go over here and say that it's going to take an error message, string, and
0:54
it's gonna take a status code,
0:57
which is an integer. Let PyCharm
1:00
add that to the class for us.
1:01
This way, when we get one of these errors,
1:03
we'll have a meaningful way to respond and let's go over here like this,
1:08
Say "super dot init" and pass the error message along as well,
1:13
perfect. So now we have one of these validation errors.
1:15
We can raise these and catch these and so on.
1:18
So, for example, instead of this, we can say if response dot, say that this
1:23
is a response, like so. You can say that the status code is not equal to 200.
1:29
Well, something went wrong over there.
1:32
So let's raise a validation error, like that,
1:35
and we'll set the error message to be like this and the status code to the status
1:43
code. Let's pick an error message.
1:45
Actually, let's just let the service communicate that response dot text, like that.
1:50
Let's see if this gives us some kind of better result for our Portlnad.
1:54
We come over here and we try again.
1:56
Well, it crashed again because we're not converting that to a response.
2:00
We'll do that now. So over here,
2:02
let's instead of just calling this, and we can just do
2:05
a return, I suppose,
2:07
like that. But instead of doing this,
2:09
let's say try to do it, and then we'll have an except validation error, like so. As
2:17
ve. And then what we want to do is return some kind of response. So return
2:21
fastapi dot response. Set the content to be ve dot error message, and
2:26
the status code to be ve dot error.
2:29
And I believe that's just gonna be, whoops status code.
2:33
Set that to just the standard,
2:35
you know, plain text response.
2:37
We could put that into a dictionary,
2:39
right? This could be a little bit nicer.
2:41
Maybe we'll do that in the end.
2:42
But let's just see what's happening now.
2:44
Try again. 404 not found. And it says 404 there
2:48
but that's not the super important thing.
2:49
Let's look at what the network says When we make this call.
2:53
There you go, 404 is the actual response
2:56
whoever called our API got,
2:58
which is perfect. So, we got our 400.
3:01
Excellent, excellent, Excellent. There's a whole bunch of other validation that we need
3:04
to add that turns out to be a lot of work.
3:07
We wanna make sure that we're always passing the lower case state,
3:10
maybe, in case that matters or not have spaces or potentially commas.
3:15
We use two letter abbreviations instead of just random text,
3:19
and so on. Now that turns out to be super error prone.
3:22
So Let's go and just do this real quick.
3:24
We're gonna throw this in and import a type here.
3:27
So we're gonna have this thing called "validate units",
3:29
which is going to take a city,
3:31
state, country and unit, and it's going to return
3:34
modified city, state, country and units.
3:38
Yes, second one maybe needs to be optional here.
3:41
So what we want to do is go and strip out the city,
3:44
make it lower case. If there's no country,
3:47
make it the US, otherwise lower case it,
3:49
strip it, make sure it has length two,
3:51
if not create an error message that says it has to be length two,
3:54
and that's bad data you passed because it's not length two.
3:58
So we're gonna raise a validation error just like before,
4:00
but now it's gonna catch that. If there's a state,
4:03
do the same thing here, the units, make sure it's lowercase.
4:06
There has to be some valid units.
4:08
It has to be one of these three.
4:10
If it's not, say it has to be one.
4:11
All that is a lot of work.
4:14
I'll copy this to save
4:15
a little typing. We'll go up to the top here,
4:19
and I'll just say that equals
4:21
validate all of those things. Okay,
4:23
let's see if we could get this to work.
4:24
So we got our Portlnad.
4:26
That's a server error on the other side.
4:28
This is valid. But what if we come over and say,
4:31
country equals USA?
4:34
Nope. It must be two letters, US. And look, your 400, bad data.
4:39
That's fine. So we got this back good again.
4:41
And what if we say "units equals metricy"?
4:45
No, no, Can't be
4:46
metricy, it has to be standard,
4:48
imperial or metric, right? So now we've got our validation happening again and notice
4:52
the status code, not just the error message is being passed along.
4:55
Cool, Right? So now,
4:56
instead of saying, "Oh, the server crashed",
4:58
if we click up here and we got Portlnad, instead
5:02
what we're getting back is error messages in terms of http status codes and meaningful messages.