Mark Puchala II
Mark Puchala II

Reputation: 652

Reject Negative Numbers as exceptions in Python

I'm trying to run a basic prompt that takes a number, then runs a recursive function on it.

Any negative number causes a recursion error, for the function being unable to handle them.

Now, I've learned with Python that situations like this call for a "try/except" model. Here's what I came up with:

try: 
  choice = int(input('Enter a number: '))
  INSERT RECURSIVE FUNCTION HERE
except RecursionError as err:
  print('Error: ', str(err))

This exception doesn't work, as it still shows the entire recursive process in red lines, with my exception only replacing the final line. I know I could easily solve this by logic, for example:

if choice < 0:
  print("Error: Bro, We don't take no Negative Numbers around here.")

However, I was taught we generally want to avoid "solving errors by Logic" in Python, instead working via the "try/except" model.

What could I do to reject negative numbers via a "try/except" model instead of an "if/else"?

If you can help me understand a way to make this react to ValueError, that'd be another great help.

Upvotes: 7

Views: 51488

Answers (3)

alam
alam

Reputation: 392

Say, you want to print only positive numbers and if the number is negative you raise an exception

a = int(raw_input())
if a < 0:
    myError = ValueError('a should be a positive number')
    raise myError
print(a)

Upvotes: 7

user11294386
user11294386

Reputation: 21

try: 
  choice = int(input('Enter a number: '))
  assert choice > 0 # Test if it true
except AssertionError :
  print("Number is negative")

Upvotes: 2

Antimony
Antimony

Reputation: 39461

The "prefer try/except" thing is a guideline, not a hard and fast rule. In this case, it doesn't make any sense, as you've discovered. You should use if choice < 0: like normal.

In general there are three reasons to prefer try/except, none of which apply here.

  1. If you're doing multiple operations in sequence, each of which can fail, and you don't care which one fails. In this case, you'd use a try block around the entire sequence of code, simplifying things.
  2. If you expect callers to use user defined types with a duck-typed interface that don't implement any particular superclass or abstract base class. This is primarily a concern when writing library code.
  3. If you expect the operation to usually succeed, and it throws an exception on failure. In this case, try/except will normally be faster.

As a side note, the main reason why "prefer try/except" is emphasized to new Python programmers is that many programmers come from languages where exceptions are slow or nonexistent, making them biased against using them, even when appropriate.

Upvotes: 3

Related Questions