简体   繁体   中英

Error Handling without using try/except in a Python Function

I wrote this python function. Project spec doesn't allow me to use try/except to handle an error. Per the doctstring I'm supposed to return False if successful, True if there's a failure and I'll call a declare_error function. Line number taken care of in a main function.

Note I'm not allowed to import anything besides sys and os, so using regular expressions are off the table.

Here is my code. Any suggestions on what I should use for the if/else statement?

#===============================================================================
def read_subsequent_lines(file_object, line_number, simulation_obj_list):
#===============================================================================
     '''Read and parse the next line of the file, confirm it matches one of the
        line signatures, such as ('sim_object_type=World', 'size=')

        Parameters: file_object, the input file object.
                    line_number, the current line number being read in.
                    simulation_obj_list, the list of converted lines.
        Returns: False for success, True for failure

        Convert the line in the file to a list of strings, with one string per
            name=value pair (such as "name=Joe").  Make sure that each line matches
            up with one of the line "signatures" in the constant definitions.
            Modify this line_list to only include the value portion of the pair,
            calling extract_line_using_signature (...) to get the each line list.
            Append each modified line_list to the simulation_obj_list( ).

        If success: Return False.
        If failure: Call declare_error (...) and Return True.
    '''
    #List of lists to contain each line of the input file
    line_list = []
    #Read in Lines and append to a list of lines containing strings
    for line in file_object:
        # print(line.strip().split(','))
        line_list.append(line.strip().split())

    #Compare line to signature constants and append to simulation_obj_list
    for i in line_list:
        #World
        if len(i) == NUM_WORLD_TOKENS:
            if i[0].startswith(LINE_SIGNATURE_TUPLE[0][0]) and i[1].startswith(LINE_SIGNATURE_TUPLE[0][1]):
                 simulation_obj_list.append(extract_line_using_signature(LINE_SIGNATURE_TUPLE[0],i))
        #Person
        if len(i) == NUM_PERSON_TOKENS:
            if i[0].startswith(LINE_SIGNATURE_TUPLE[1][0]) and i[1].startswith(LINE_SIGNATURE_TUPLE[1][1]) and \
                i[2].startswith(LINE_SIGNATURE_TUPLE[1][2]):
                    simulation_obj_list.append(extract_line_using_signature(LINE_SIGNATURE_TUPLE[1],i))
        #Robot
        if len(i) == NUM_ROBOT_TOKENS:
            if i[0].startswith(LINE_SIGNATURE_TUPLE[2][0]) and i[1].startswith(LINE_SIGNATURE_TUPLE[2][1]) and \
                i[2].startswith(LINE_SIGNATURE_TUPLE[2][2]) and i[3].startswith(LINE_SIGNATURE_TUPLE[2][3]):
                simulation_obj_list.append(extract_line_using_signature(LINE_SIGNATURE_TUPLE[2],i))

The quick ugly fix is to use elif s and else s (I'm assuming NUM_WORLD_TOKENS , NUM_PERSON_TOKENS , and NUM_ROBOT_TOKENS are all unique values):

#Compare line to signature constants and append to simulation_obj_list
for i in line_list:
    #World
    if len(i) == NUM_WORLD_TOKENS:
        if i[0].startswith(LINE_SIGNATURE_TUPLE[0][0]) and i[1].startswith(LINE_SIGNATURE_TUPLE[0][1]):
             simulation_obj_list.append(extract_line_using_signature(LINE_SIGNATURE_TUPLE[0],i))
        else:
            declare_error()
            return True
    #Person
    elif len(i) == NUM_PERSON_TOKENS:
        if i[0].startswith(LINE_SIGNATURE_TUPLE[1][0]) and i[1].startswith(LINE_SIGNATURE_TUPLE[1][1]) and \
            i[2].startswith(LINE_SIGNATURE_TUPLE[1][2]):
                simulation_obj_list.append(extract_line_using_signature(LINE_SIGNATURE_TUPLE[1],i))
        else:
            declare_error()
            return True
    #Robot
    elif len(i) == NUM_ROBOT_TOKENS:
        if i[0].startswith(LINE_SIGNATURE_TUPLE[2][0]) and i[1].startswith(LINE_SIGNATURE_TUPLE[2][1]) and \
            i[2].startswith(LINE_SIGNATURE_TUPLE[2][2]) and i[3].startswith(LINE_SIGNATURE_TUPLE[2][3]):
            simulation_obj_list.append(extract_line_using_signature(LINE_SIGNATURE_TUPLE[2],i))
        else:
            declare_error()
            return True

    return False

That is very smelly code though. How about using regular expressions?

for line in lines:
    if re.match(WORLD_REGEX, line):
        simulation_obj_list.append(
            extract_line_using_signature(LINE_SIGNATURE_TUPLE[0], line))
    elif re.match(PERSON_REGEX, line):
        # etc

    else:
        declare_error()
        return True

    return False

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM