title: Is there a way in Python to manually exit the "with" statement (context manager)
body: <p>I am using a PySide (Qt) Gui that should exit a loop on a button click. A button click for PySide emits a signal and the signal calls the connected functions. However, when the signal calls the functions it uses it's own system for Error handling. </p>
  
  <p>I don't really want to do the fix for that Signal Error handling.</p>
  
  <p>Is there a way to break out of a "with" statement without raising errors.</p>
  
  <pre><code>import sys
  import time
  from PySide import QtGui, QtCore
  
  class MyClassError(Exception): pass
  
  class MyClass(QtGui.QProgressDialog):
  
      def __init__(self, *args, **kwargs):
          super().__init__(*args, **kwargs)
  
          # Properties
          self.setWindowFlags(QtCore.Qt.Dialog | QtCore.Qt.WindowTitleHint)
          self.setWindowModality(QtCore.Qt.WindowModal)
          self.setMinimumDuration(2000) # if progress is finished in 2 sec it wont show
          self.setRange(0, 99)
      # end Constructor
  
      def breakOut(self):
          print("break out")
          self.__exit__(MyClassError, "User cancel!", "") # does not break out of "with"
          raise MyClassError("User cancel!") # PySide just prints Exception
      # end breakOut
  
      def __enter__(self):
          self.canceled.connect(self.breakOut)
          return self
      # end enter (with)
  
      def __exit__(self, etype, value, traceback):
  #         self.canceled.disconnect(self.breakOut)
          if etype is None or etype == MyClassError:
              return True
          raise
      # end exit
  # end class MyClass
  
  if __name__ == "__main__":
      app = QtGui.QApplication(sys.argv)
  
      window = QtGui.QMainWindow()
      window.show()
  
      myinst = MyClass()
      window.setCentralWidget(myinst)
  
      val = 0
      with myinst:
          for i in range(100):
              myinst.setLabelText(str(i))
              myinst.setValue(i)
              val = i+1
              time.sleep(0.1)
      # end with
      print(val)
  
      sys.exit(app.exec_())
  </code></pre>
  
  <p>The fixes that I have seen for PySide/Qt error handling in signals doesn't look nice. It overrides QApplication which means that someone else using this class has to use the new QApplication.</p>
  
  <p>Is there an easy way around PySide/Qt signal error handling or is there an alternative way of breaking out of a "with" statement.</p>