Confused compare function :)

peter pjmakey2 at gmail.com
Thu Dec 6 15:46:25 CET 2012


On 12/06/2012 10:58 AM, Chris Angelico wrote:
> On Fri, Dec 7, 2012 at 12:33 AM, Thomas Rachel
> <nutznetz-0c1b6768-bfa9-48d5-a470-7603bd3aa915 at spamschutz.glglgl.de>
> wrote:
>> Am 06.12.2012 09:49 schrieb Bruno Dupuis:
>>
>>> The point is Exceptions are made for error handling, not for normal
>>> workflow. I hate when i read that for example:
>>>
>>>       try:
>>>           do_stuff(mydict[k])
>>>       except KeyError:
>>>           pass
>> I would do
>>
>>      try:
>>          value = mydict[k]
>>      except KeyError:
>>          pass
>>      else:
>>          do_stuff(k)
>>
>> Why? Because do_stuff() might raise a KeyError, which should not go
>> undetected.
> (Assuming first off that you meant "do_stuff(value)", not
> "do_stuff(k)", in that last line)
>
> That has quite different functionality, though. The original wouldn't
> have called do_stuff at all if k is not in dict, behaviour which is
> matched by both his EAFP and his LBLY. But your version, in the event
> of a KeyError, will call do_stuff with the previous value of value, or
> raise NameError if there is no such previous value. I don't think
> that's intentional.
>
> The only way around it that I can see is an extra condition or jump -
> something like:
>
> def call_if_present(mydict,k,do_stuff):
>      """Equivalent to
>      do_stuff(mydict[k])
>      if the key is present; otherwise, does not call do_stuff, and
> returns None."""
>      try:
>          value = mydict[k]
>      except KeyError:
>          return
>      return do_stuff(value)
>
> It'll propagate any other exceptions from the subscripting (eg
> TypeError if you give it a list instead of a dict), and any exceptions
> from do_stuff itself. But it's getting a bit unwieldy.
>
> ChrisA
Ok, is seems like my example code, don't like :). Is ok, it was a poor 
example.
This a more complex example that create a python daemons process.
In these case you see the help of try catch. To watch an Operating 
system problem (80% of the cases), when the fork is created. Or  you can 
initialize a logging (in the catch statement)
and watch the log file with tail -f.


import sys, os
def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
     # Perform first fork.
     try:
         pid = os.fork( )
         if pid > 0:
             sys.exit(0) # Exit first parent.
     except OSError, e:
         sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, 
e.strerror))
         sys.exit(1)
# Decouple from parent environment.
     os.chdir("/")
     os.umask(0)
     os.setsid( )
# Perform second fork.
     try:
         pid = os.fork( )
         if pid > 0:
             sys.exit(0) # Exit second parent.
     except OSError, e:
         sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, 
e.strerror))
         sys.exit(1)
# The process is now daemonized, redirect standard file descriptors.
     for f in sys.stdout, sys.stderr: f.flush( )
     si = file(stdin, 'r')
     so = file(stdout, 'a+')
     se = file(stderr, 'a+', 0)
     os.dup2(si.fileno( ), sys.stdin.fileno( ))
     os.dup2(so.fileno( ), sys.stdout.fileno( ))
     os.dup2(se.fileno( ), sys.stderr.fileno( ))

Or imagine that you are manage master-slave's connections (for examples 
to an ldap databse - or a monitor system tools), you can use try catch.
If all the server's are down, maybe you want to be inform about it, you 
can put a function to send a email to your account

In simple works try: catch is 'GOOD'.

ipserver = {"192.168.1.13": ["monitoreo", 22],
             "192.168.1.18": ["usuarios-dns", 22, 53, 139, 389, 445, 
631, 3306, 4900, 8765],
             "192.168.1.72": ["sistemas-ldap", 22, 80, 139, 389, 445, 
631, 3306, 4900, 8765],
             "192.168.1.74": ["terminales", 22,139, 445, 389, 4900],
             "192.168.1.80": ["backup", 22, 139, 445],
             "192.168.1.1": ["router", 21, 22, 25, 80, 110, 143, 465, 3128],
             "192.168.1.90": ["router", 5900]
             }

def portstatus(self, **kwargs):
         ports = kwargs.get("ports")
         server = kwargs.get("server")
         if len(ports) > 0:
             logging.info("chequeando puertos %s" % server)
             for a in ports:
                 try:
                     sock = socket()
                     sock.connect((server,a))
                     sock.close
                 except:
                     logging.info("informando errores en puerto %s" % a)
                     today = str(datetime.today())
                     subprocess.Popen("for a in $(seq 1 15); do beep; 
done", shell=True)
                     self.sendreport(ip=server, server=server, 
cuerpo="El puerto  %s esta caido en %s - %s" % (a, server, today), 
asunto="El puerto  %s esta caido en %s - %s" % (a, server, today))
         else:
             logging.info("no hay puertos que chequear")










More information about the Python-list mailing list