usage of try except for review.

Steven D'Aprano steve at pearwood.info
Tue Mar 1 11:58:50 EST 2016


On Mon, 29 Feb 2016 07:13 pm, Ganesh Pal wrote:


> def run_cmd_and_verify(cmd, timeout=1000):
>     try:
>         out, err, ret = run(cmd, timeout=timeout)
>         assert ret ==0,"ERROR (ret %d): " \
>                 " \nout: %s\nerr: %s\n" % (ret, out, err)

Do not use assert for error checking.

http://import-that.dreamwidth.org/676.html


Instead, you should write this:


        out, err, ret = run(cmd, timeout=timeout)
        if ret != 0:
            raise RuntimeError(
                  "ERROR (ret %d): \nout: %s\nerr: %s\n" % (ret, out, err))


>     except Exception as e:
>         logging.error("Failed to run %s got %s" % (cmd, e))
>         return False
>     return True
> 
> 
> def run_test():
>     """
>     Mount
>     """
>     pdb.set_trace()

Do not use the debugger as part of production code. The debugger is for
debugging. When you have debugged the section of code, remove the debugger
calls.


>     for cmd in ["mount /nfs_mount1", "mount /cifs_mount1"]:
>         try:
>             if not run_cmd_and_verify(cmd, timeout=3600):
>                 return False
>         except:
>            logging.error("Failure while running command %")
>     logging.info("Setup and Creation ....Done !!!")

Do not use bare except clauses like this unless you know what you are doing.

https://realpython.com/blog/python/the-most-diabolical-python-antipattern/



>     cmd = "run_scan"
>     out, err, ret = run(cmd)
>     for cmd in ["create_data.py -nfs ",
>                 "validate.py -30 "]:
>         try:
>             if not run_cmd_and_verify(cmd, timeout=3600):
>                return False
>         except:
>             logging.error("")
>             return False
>     logging.info("Mount IS START.....Done !!!")
> 
> def main():
>     if not run_test():
>         sys.exit("Exiting Main")
> 
> 
> if __name__ == '__main__':
>     main()


I would re-write this script as something like this:



# Untested

def run_cmd(cmd, timeout=1000):
    out, err, ret = run(cmd, timeout=timeout)
    if ret != 0:
        raise RuntimeError(
              "ERROR (ret %d): \nout: %s\nerr: %s\n" % (ret, out, err))


def run_test():
    for cmd in ["mount /nfs_mount1", "mount /cifs_mount1"]:
        run_cmd(cmd, timeout=3600)
    logging.info("Setup and Creation ....Done !!!")
    cmd = "run_scan"
    out, err, ret = run(cmd)
    # Do you care about the result of the scan? Then you should log it.
    for cmd in ["create_data.py -nfs ", "validate.py -30 "]:
        run_cmd(cmd, timeout=3600)
    logging.info("Mount IS START.....Done !!!")
 

if __name__ == '__main__':
    try:
        run_test()
    except Exception as err:
        logging.error("run_test failed", exc_info=True)
        sys.exit(1)



> Question 1:
> 
> 
> 
> 1. Have I used try and expect block correctly  ? , In my case I have
> the except block that's  is not needed it just gives an  message I
> have still included for the sake of try block

If the except block is not needed, then you should not use try.


> 2.  If a failure’s are encountered  the error by assert condition the
> errors are now displayed on the screen , how do I redirect it to log
> file using logging error

Don't use assert like that.



> 3. my function def has 1000 but Iam using 3600 in the calling fnx etc
> , Time out value are overwritten ?

I don't understand the question.



-- 
Steven




More information about the Python-list mailing list