old_contents: # create a class that has a __getitem__ method
  class A:
      def __getitem__(self, index):
          print('getitem', index)
          if index > 10:
              raise StopIteration
  
  # test __getitem__
  A()[0]
  A()[1]
  
  # iterate using a for loop
  for i in A():
      pass
  
  # iterate manually
  it = iter(A())
  try:
      while True:
          next(it)
  except StopIteration:
      pass
  
  # this class raises a non-StopIteration exception on iteration
  class A:
      def __getitem__(self, i):
          raise TypeError
  try:
      for i in A():
          pass
  except TypeError:
      print("TypeError")
  
new_contents: # create a class that has a __getitem__ method
  class A:
      def __getitem__(self, index):
          print('getitem', index)
          if index > 10:
              raise StopIteration
  
  # test __getitem__
  A()[0]
  A()[1]
  
  # iterate using a for loop
  for i in A():
      pass
  
  # iterate manually
  it = iter(A())
  try:
      while True:
          next(it)
  except StopIteration:
      pass
  
  # this class raises an IndexError to stop the iteration
  class A:
      def __getitem__(self, i):
          raise IndexError
  print(list(A()))
  
  # this class raises a non-StopIteration exception on iteration
  class A:
      def __getitem__(self, i):
          raise TypeError
  try:
      for i in A():
          pass
  except TypeError:
      print("TypeError")
  
subject: Add test where __getitem__ raises IndexError to stop iteration.