Python Python Basics All Together Now Handle Exceptions

Kailash Seshadri
Kailash Seshadri
2,393 Points

if statement after try statement

Instead of doing it the way Craig did it in the video, I put the if statement after the try statement, under the else. So i go something like this:

TICKET_PRICE = 10

tickets_remaining = 100  


while tickets_remaining >= 1:
    print ('There are {} tickets remaining'.format(tickets_remaining))
    name = input('What is your name? ')
    num_tickets = input('Hey, {}! How many tickets would you like? '.format(name))
        #Expect a ValueError and handle it appropriately
    try:
        num_tickets = int(num_tickets)
        #Raise a ValueError if the request is more than available.
    except ValueError:
        print('Please enter a whole number!') 
    else:
        #####
        if num_tickets > tickets_remaining:
            print('Sorry, We do not have those many tickets! Try again!')
        else:
            #####
            amount_due = num_tickets * TICKET_PRICE
            print('The total due is ${}. Thank you!'.format(amount_due))
            proceed = input('Would you like to proceed?(Please type Y or N): ')
            if proceed.lower() == 'y':
                print(f'Thank you for purchasing {num_tickets} tickets, {name}!')
                #TO DO: Gather credit card information and process it
                       #AND note down f-strings(above) (Python 2.6 and above only)
                tickets_remaining -= num_tickets
            else:
                print('Thank you anyways, {}!'.format(name))    
print('Sorry {}, tickets are sold out! :-('.format (name))

What difference does it make if I do it this way, unlike the way Craig does it?

Steven Parker
Steven Parker
171,327 Points

I'm not seeing a "for" statement, which line is it on?

Kailash Seshadri
Kailash Seshadri
2,393 Points

Side note: This is what Craig did in the video, for those who have not, or don't want to , watch it:

TICKET_PRICE = 10

tickets_remaining = 100  


while tickets_remaining >= 1:
    print ('There are {} tickets remaining'.format(tickets_remaining))
    name = input('What is your name? ')
    num_tickets = input('Hey, {}! How many tickets would you like? '.format(name))
        #Expect a ValueError and handle it appropriately
    try:
        num_tickets = int(num_tickets)
        #Raise a ValueError if the request is more than available.
        #####
        if num_tickets > tickets_remaining:
            raise ValueError ('There are only {} tickets reamining'.format (tickets_remaining))
    except ValueError as err:
        print('Oh no! we ran into an issue! {}. Please try again.'.format(err)) 
        #####
    else:
        amount_due = num_tickets * TICKET_PRICE
        print('The total due is ${}. Thank you!'.format(amount_due))
        proceed = input('Would you like to proceed?(Please type Y or N): ')
        if proceed.lower() == 'y':
            print(f'Thank you for purchasing {num_tickets} tickets, {name}!')
            #TO DO: Gather credit card information and process it
                   #AND note down f-strings(above) (Python 2.6 and above only)
            tickets_remaining -= num_tickets
        else:
            print('Thank you anyways, {}!'.format(name))    
print('Sorry {}, tickets are sold out! :-('.format (name))
Kailash Seshadri
Kailash Seshadri
2,393 Points

Steven - Yeah, I'm sorry, I meant the try statement, not a for...

1 Answer

Steven Parker
Steven Parker
171,327 Points

I assume you meant "after the try statement", in which case the difference is how a value that exceeds the number of remaining tickets will be handled. In Craig's code, the "except" is written to be generic and it handles that because of the "raise". But in your code, you handle it with a "print".

Then, you need another "else" (and a lot more indenting) to avoid dropping into the purchase code. But Craig's solution doesn't need anything extra because the exception also takes care of that.

Kailash Seshadri
Kailash Seshadri
2,393 Points

So there is no real difference between the works of my code and Craig's, except that his is cleaner? And yeah, I meant the try statement, not for... Sorry!

Steven Parker
Steven Parker
171,327 Points

The code is less compact, and the error messages are different. But I expect you intended that last difference.