Restarting a program after exception

前端 未结 4 752
执念已碎
执念已碎 2020-12-28 08:45

I have a program that queries an API every few seconds. Each response triggers a few functions which themselves make some calls to websites and such -- calls that I don\'t w

相关标签:
4条回答
  • 2020-12-28 09:10

    Refactor this - you'll get a stackoverflow error sooner or later if you have enough failures.

    queryRepeatedly should just be query. It should return void and throw exceptions on failures.

    Wrap in something that looks like this, your true queryRepeatedly function?

    while True:
        try:
            query()
        except:
            #handle
        time.sleep(15)
    

    All looping, no recursion needed.

    Note that you must think carefully about how much of your program you need to restart. From your question it sounded like your actual problem was ensuring the query could try again if it sporadically fails, which is what my solution ensures. But if you want to clean up program resources - say, bounce SQL connections, which may have broken - then you need to think more carefully about how much of your program you need to "restart." In general you need to understand why your query failed to know what to fix, and in the extreme case, the right thing to do is an email or SMS to someone on call who can inspect the situation and write an appropriate patch or fix.

    0 讨论(0)
  • 2020-12-28 09:24

    First make two files.

    One file called run.py and one called forever.py and put them in the same folder.

    Go to your terminal within that folder and type chmod +x forever.py

    run.py

    whatever code you want to run
    

    forever.py

    #!/usr/local/lib/python3.7
    from subprocess import Popen
    import sys
    
    filename = sys.argv[1]
    while True:
        print("\nStarting " + filename)
        p = Popen("python3 " + filename, shell=True)
        p.wait()
    

    Open a terminal window from the folder and type this:

    python3 ./forever.py retweet.py

    to start run.py and if it fails or has an exception, it'll just start over again.

    You now have a template to make sure if a file crashes or has an exception, you can restart it without being around. If this helps you, please give me a vote!

    0 讨论(0)
  • 2020-12-28 09:27

    In your exception make a recursive call

    except:
          queryRepeatedly()
    
    0 讨论(0)
  • 2020-12-28 09:31

    To restart anything, just use a while loop outside the try. For example:

    def foo():
        while True:
            try:
                foo2()
            except:
                pass
            else:
                break
    

    And if you want to pass the exception up the chain, just do this in the outer function instead of the inner function:

    def queryRepeatedly():
        while True:
            while True:
                try:
                    foo()
                    bar()
                    baz()
                except:
                    pass
                else:
                    break
            time.sleep(15)
    
    def foo():
        foo2()
    

    All that indentation is a little hard to read, but it's easy to refactor this:

    def queryAttempt()
        foo()
        bar()
        baz()
    
    def queryOnce():
        while True:
            try:
                queryAttempt()
            except:
                pass
            else:
                break
    
    def queryRepeatedly():
        while True:
            queryOnce()
            time.sleep(15)
    

    But if you think about it, you can also merge the two while loops into one. The use of continue may be a bit confusing, but see if you like it better:

    def queryRepeatedly():
        while True:
            try:
                foo()
                bar()
                baz()
            except:
                continue()
            time.sleep(15)
    
    0 讨论(0)
提交回复
热议问题