komodo
komodo

Reputation: 39

Pass variable to an exception?

I am trying to learn Python and I want to know if it is possible to pass a variable to an Exception? This is the code I have:

try:
    staffId = int(row['staffId'])
    openingSalary = int(row['initialSalary'])
    monthsWorked = float(row['monthsWorked'])
except CutomException:
    pass

class CustomException(ValueError): # raised if data conversion fails
    def __init__(self):
        print("There was a problem converting data")

I want to pass staffId to the exception so that I can print something like:

print("There was a problem converting data for staff Id: ", staffId)

I tried this with no success: How to pass a variable to an exception when raised and retrieve it when excepted?

Upvotes: 2

Views: 8188

Answers (3)

Foreever
Foreever

Reputation: 7468

I think you should handle the exception in the except block and not inside the exception class.

try:
    raise CustomException(foo)
except CutomException as e:
    print(e.args)
    handle_exception()

class CustomException(Exception):
    def __init__(self, foo):
        super().__init__(foo, bar)

Upvotes: 0

Ryan
Ryan

Reputation: 14649

The caller of the exception, e.g. the one that raise exception will have to pass an argument to the constructor.

class CustomException(ValueError): # raised if data conversion fails
    def __init__(self, message):
        self.message = message;
        print("There was a problem converting data")


try:
    try:
        staffId = int(row['staffId'])
        openingSalary = int(row['initialSalary'])
        monthsWorked = float(row['monthsWorked'])
    except ValueError as e:
        raise CustomException(e);
except CustomException:
    pass

Upvotes: 3

Anthony Forloney
Anthony Forloney

Reputation: 91786

The custom exception will need to be raise'd conditionally by the try block to include the staffId variable. As an example, when the staffId is a str and not an int.

try:
    # conditionalize a scenario where you'd want to raise an error
    #  (e.g. the variable is a string)
    if type(staffId) is str:
        raise CustomException(staffId)
    else:
        staffId = int(row['staffId'])
        openingSalary = int(row['initialSalary'])
        monthsWorked = float(row['monthsWorked'])
except CutomException:
    pass

class CustomException(ValueError): # raised if data conversion fails
    def __init__(self, id):
        print("There was a problem converting data %s" % id)

Upvotes: 1

Related Questions