[Tutor] I need to ignore an error let the script continue to run

Jim jf_byrnes at comcast.net
Wed May 6 21:54:55 EDT 2020


On 5/6/20 4:28 AM, Peter Otten wrote:
> Jim wrote:
> 
>> On 5/5/20 4:13 PM, Mark Lawrence wrote:
>>> On 05/05/2020 21:28, Jim wrote:
>>>> On 5/5/20 9:38 AM, Jim wrote:
>>>>> On 5/5/20 3:01 AM, Alan Gauld via Tutor wrote:
>>>>>> On 05/05/2020 03:41, Jim wrote:
>>>>>>
>>>>>>> It seems try/except will not process the keys after the missing one.
>>>>>>
>>>>>> You need to wrap each bit that needs to continue in try/except.
>>>>>> Clunky I agree.
>>>>>>
>>>>>>> 'Recepient username: ' + header['to'].addresses[0].username+'\n',
>>>>>>> 'Sender name: ' + header['from'].addresses[0].display_name
>>>>>>>
>>>>>>> They don't look like keys, but they do resolve to the info I want
>>>>>>> if it
>>>>>>> is in the header.
>>>>>>
>>>>>> They aren't keys they are accessing attributes of some class that is
>>>>>> returned. You could check the return value from header first using
>>>>>> an if
>>>>>> test. Or you could just wrap those two calls in their own try/except.
>>>>>>
>>>>>> Or you could use get() and return a dummy instance of whatever class
>>>>>> it is with whatever default values you need.
>>>>>>
>>>>>> So several solutions only you can decide which suits you best.
>>>>>
>>>>> OK, thanks, I'll give them a try and see which on works best.
>>>>>
>>>>
>>>> It seems every time I tried to test the return value from header I
>>>> would get an error, so I went the try/except route. This what I ended
>>>> up with:
>>>>
>>>> def parse_header(msg):
>>>> with open('/home/jfb/' + email_msg, 'rb') as fp:
>>>> header = BytesHeaderParser(policy=default).parse(fp)
>>>> #  Now the header items can be accessed as a dictionary:
>>>> try:
>>>> username =  header['to'].addresses[0].username + '\n'
>>>> except:
>>>
>>> Never use a bare except as in the long term it's asking for trouble,
>>> catch what you know can occur and let anything else raise it's own
>>> exception.
>>>
>>>> username = ' Blank \n'
>>
>> I just write small scripts for my own use, so I really haven't had the
>> occasion to use try/except much. I'm sure your advice it correct in most
>> cases. I'm using try/except more like an 'if'. I needed some way to test
>> if certain items were  not in the header data being returned. It seemed
>> that no matter how I tried to reference them I got an error because they
>> tried to return data that was not there. Maybe it can be done but I
>> could never figure it out. Alan suggested a couple of things, one of
>> which was try/except. That's how I came up with what you see. I'm
>> probably abusing try/except, but it works and if it breaks I'll just
>> have to fix it.
>>
>> Thanks for your input.
> 
>> I just write small scripts for my own use
> 
> I sometimes use that as an excuse to do nasty things, too, but with broad
> excepts you tend to make your life harder than need be.
> 
> And it's really easy to be specific. If you run your script and get an
> exception in the line
> 
> username = header['to'].addresses[0].username + '\n'
> 
> the traceback will tell you what exception to catch, or what problem to
> guard against. For instance:
> 
> [...]
>      username =  header['to'].addresses[0].username + '\n'
> AttributeError: 'NoneType' object has no attribute 'addresses'
> 
> You could catch the AttributeError, but the error message tells you that
> header["to"] is None, so you probably don't use try...except at all:
> 
> header_to = header["to"]
> if header_to is None:
>      username = "#missing"
> else:
>      username = header_to.adresses[0].username + "\n"
> 
> The code runs for a while, and then you get
> 
>      username = header_to.addresses[0].username + "\n"
> IndexError: list index out of range
> 
> Again you could catch
> 
> try:
>      address = header_to.addresses[0]
> except IndexError:
>      ...
> else
>     username = address.username + "\n"
> 
> or add an explicit check:
> 
> addresses = header_to.addresses
> if len(addresses) > 0:  # the idiomatic check would be 'if addresses: ...'
>      username = addresses[0].username
> else:     ...

I have never been able to construct an 'if' that allows the script to 
run. Finally I gave up and used Alan's explanation and suggestion about 
specific try/except's.

Thanks, Jim


> In short: you run(*) your script, see a specific exception, and write code
> to handle just that exception, either by catching it or by adding a check to
> avoid it.
> 
> A bare except will sabotage this iterative process and you won't see other
> problems at the line where they originate, making them much harder to debug.
> 
> (*) The "professional" version of "run your script" is of course to write
> unit tests and run those.
> 



More information about the Tutor mailing list