title: python: raise("customException") - why no stack trace?
body: <p>Using custom exceptions in python (v2.7.3): don't get a stack trace when call getSub() whereas getSub(True) invokes one, the difference being that it is caused via an additional try...except which I want to avoid (+feels unnecessary) so why/how can it be avoided?</p>
  
  <pre><code>import sys, traceback
  
  class customException(Exception):
      def __init__(self, *args):
          super(customException,self).__init__(*args)
          print "Stack trace within exception", traceback.extract_tb(sys.exc_info()[2])
          errTxt = [a for a in args]
          print "error text", errTxt
  
  def getFn():
      try:
          getSub()
      except customException as e:
          print "customException was raised"
      try:
          getSub(True)
      except customException as e:
          print "customException2 was raised"
  
  def getSub(flag=False):
      if flag:
          try:
              1/0
          except:
              raise customException('test')
      else:
          raise customException('test')
  
  getFn()
  </code></pre>
  
  <p>output:</p>
  
  <pre><code>Stack trace within exception []
  error text ['test']
  customException was raised
  Stack trace within exception [('./test3.py', 25, 'getSub', '1/0')]
  error text ['test']
  customException2 was raised
  </code></pre>
  
  <p>To put the above in context I have code (pseudo) along the below lines and it wasn’t until I boiled down the code to the above example that I realised why the traceback access was not always working.  The purpose of the custom exception class is to collect an aggregate count of exceptions in order to classify downstream the result of each do_something, e.g. fatal, warning etc.  The use of the traceback was to record from WHERE the exception was ‘raised’ and therefore the creation of an exception (1/0 = albeit seems out of place) enables that to work.  Wondering about using the inspect module rather than thinking about this within the traceback stack?</p>
  
  <pre><code>__main__
  With each item in set:
      Try:
          do_something(item)
      except customException()
          clean up = log info etc.
  end With
  end.__main__
  
  do_something(item)
      try:
          check_something()
      except customException
          if exception=typeA.1 raise customException(Type1)
          if exception=typeB.2 and item = ‘x’
              raise customException(Type2)
  
  check_something()
      a = getInfo()
      unless getInfo()
          raise customException(typeA.1)
      try:
          b = getOtherInfo()
      except customException
          raise customException(typeB.2)
      …
  </code></pre>