##// END OF EJS Templates
update CompositeError docs with recent changes
MinRK -
Show More
@@ -34,19 +34,13 b' The following will fail:'
34 34 In [3]: A = numpy.zeros(2)
35 35
36 36 In [4]: def setter(a):
37 ...: a[0]=1
38 ...: return a
37 ...: a[0]=1
38 ...: return a
39 39
40 40 In [5]: rc[0].apply_sync(setter, A)
41 41 ---------------------------------------------------------------------------
42 RemoteError Traceback (most recent call last)
43 ...
44 RemoteError: RuntimeError(array is not writeable)
45 Traceback (most recent call last):
46 File "/path/to/site-packages/IPython/parallel/streamkernel.py", line 329, in apply_request
47 exec code in working, working
48 File "<string>", line 1, in <module>
49 File "<ipython-input-14-736187483856>", line 2, in setter
42 RuntimeError Traceback (most recent call last)<string> in <module>()
43 <ipython-input-12-c3e7afeb3075> in setter(a)
50 44 RuntimeError: array is not writeable
51 45
52 46 If you do need to edit the array in-place, just remember to copy the array if it's read-only.
@@ -759,7 +759,7 b' Parallel exceptions'
759 759 -------------------
760 760
761 761 In the multiengine interface, parallel commands can raise Python exceptions,
762 just like serial commands. But, it is a little subtle, because a single
762 just like serial commands. But it is a little subtle, because a single
763 763 parallel command can actually raise multiple exceptions (one for each engine
764 764 the command was run on). To express this idea, we have a
765 765 :exc:`CompositeError` exception class that will be raised in most cases. The
@@ -768,58 +768,32 b' more other types of exceptions. Here is how it works:'
768 768
769 769 .. sourcecode:: ipython
770 770
771 In [76]: dview.block=True
771 In [78]: dview.block = True
772
773 In [79]: dview.execute("1/0")
774 [0:execute]:
775 ---------------------------------------------------------------------------
776 ZeroDivisionError Traceback (most recent call last)<ipython-input-1-05c9758a9c21> in <module>()
777 ----> 1 1/0
778 ZeroDivisionError: integer division or modulo by zero
779
780 [1:execute]:
781 ---------------------------------------------------------------------------
782 ZeroDivisionError Traceback (most recent call last)<ipython-input-1-05c9758a9c21> in <module>()
783 ----> 1 1/0
784 ZeroDivisionError: integer division or modulo by zero
772 785
773 In [77]: dview.execute('1/0')
786 [2:execute]:
774 787 ---------------------------------------------------------------------------
775 CompositeError Traceback (most recent call last)
776 /home/user/<ipython-input-10-5d56b303a66c> in <module>()
777 ----> 1 dview.execute('1/0')
778
779 /path/to/site-packages/IPython/parallel/client/view.pyc in execute(self, code, targets, block)
780 591 default: self.block
781 592 """
782 --> 593 return self._really_apply(util._execute, args=(code,), block=block, targets=targets)
783 594
784 595 def run(self, filename, targets=None, block=None):
785
786 /home/user/<string> in _really_apply(self, f, args, kwargs, targets, block, track)
787
788 /path/to/site-packages/IPython/parallel/client/view.pyc in sync_results(f, self, *args, **kwargs)
789 55 def sync_results(f, self, *args, **kwargs):
790 56 """sync relevant results from self.client to our results attribute."""
791 ---> 57 ret = f(self, *args, **kwargs)
792 58 delta = self.outstanding.difference(self.client.outstanding)
793 59 completed = self.outstanding.intersection(delta)
794
795 /home/user/<string> in _really_apply(self, f, args, kwargs, targets, block, track)
796
797 /path/to/site-packages/IPython/parallel/client/view.pyc in save_ids(f, self, *args, **kwargs)
798 44 n_previous = len(self.client.history)
799 45 try:
800 ---> 46 ret = f(self, *args, **kwargs)
801 47 finally:
802 48 nmsgs = len(self.client.history) - n_previous
803
804 /path/to/site-packages/IPython/parallel/client/view.pyc in _really_apply(self, f, args, kwargs, targets, block, track)
805 529 if block:
806 530 try:
807 --> 531 return ar.get()
808 532 except KeyboardInterrupt:
809 533 pass
810
811 /path/to/site-packages/IPython/parallel/client/asyncresult.pyc in get(self, timeout)
812 101 return self._result
813 102 else:
814 --> 103 raise self._exception
815 104 else:
816 105 raise error.TimeoutError("Result not ready.")
817
818 CompositeError: one or more exceptions from call to method: _execute
819 [0:apply]: ZeroDivisionError: integer division or modulo by zero
820 [1:apply]: ZeroDivisionError: integer division or modulo by zero
821 [2:apply]: ZeroDivisionError: integer division or modulo by zero
822 [3:apply]: ZeroDivisionError: integer division or modulo by zero
788 ZeroDivisionError Traceback (most recent call last)<ipython-input-1-05c9758a9c21> in <module>()
789 ----> 1 1/0
790 ZeroDivisionError: integer division or modulo by zero
791
792 [3:execute]:
793 ---------------------------------------------------------------------------
794 ZeroDivisionError Traceback (most recent call last)<ipython-input-1-05c9758a9c21> in <module>()
795 ----> 1 1/0
796 ZeroDivisionError: integer division or modulo by zero
823 797
824 798 Notice how the error message printed when :exc:`CompositeError` is raised has
825 799 information about the individual exceptions that were raised on each engine.
@@ -828,33 +802,14 b' If you want, you can even raise one of these original exceptions:'
828 802 .. sourcecode:: ipython
829 803
830 804 In [80]: try:
831 ....: dview.execute('1/0')
805 ....: dview.execute('1/0', block=True)
832 806 ....: except parallel.error.CompositeError, e:
833 807 ....: e.raise_exception()
834 ....:
835 ....:
808 ....:
809 ....:
836 810 ---------------------------------------------------------------------------
837 RemoteError Traceback (most recent call last)
838 /home/user/<ipython-input-17-8597e7e39858> in <module>()
839 2 dview.execute('1/0')
840 3 except CompositeError as e:
841 ----> 4 e.raise_exception()
842
843 /path/to/site-packages/IPython/parallel/error.pyc in raise_exception(self, excid)
844 266 raise IndexError("an exception with index %i does not exist"%excid)
845 267 else:
846 --> 268 raise RemoteError(en, ev, etb, ei)
847 269
848 270
849
850 RemoteError: ZeroDivisionError(integer division or modulo by zero)
851 Traceback (most recent call last):
852 File "/path/to/site-packages/IPython/parallel/engine/streamkernel.py", line 330, in apply_request
853 exec code in working,working
854 File "<string>", line 1, in <module>
855 File "/path/to/site-packages/IPython/parallel/util.py", line 354, in _execute
856 exec code in globals()
857 File "<string>", line 1, in <module>
811 ZeroDivisionError Traceback (most recent call last)<ipython-input-1-05c9758a9c21> in <module>()
812 ----> 1 1/0
858 813 ZeroDivisionError: integer division or modulo by zero
859 814
860 815 If you are working in IPython, you can simple type ``%debug`` after one of
@@ -864,112 +819,56 b' instance:'
864 819 .. sourcecode:: ipython
865 820
866 821 In [81]: dview.execute('1/0')
822 [0:execute]:
867 823 ---------------------------------------------------------------------------
868 CompositeError Traceback (most recent call last)
869 /home/user/<ipython-input-10-5d56b303a66c> in <module>()
870 ----> 1 dview.execute('1/0')
871
872 /path/to/site-packages/IPython/parallel/client/view.pyc in execute(self, code, targets, block)
873 591 default: self.block
874 592 """
875 --> 593 return self._really_apply(util._execute, args=(code,), block=block, targets=targets)
876 594
877 595 def run(self, filename, targets=None, block=None):
878
879 /home/user/<string> in _really_apply(self, f, args, kwargs, targets, block, track)
880
881 /path/to/site-packages/IPython/parallel/client/view.pyc in sync_results(f, self, *args, **kwargs)
882 55 def sync_results(f, self, *args, **kwargs):
883 56 """sync relevant results from self.client to our results attribute."""
884 ---> 57 ret = f(self, *args, **kwargs)
885 58 delta = self.outstanding.difference(self.client.outstanding)
886 59 completed = self.outstanding.intersection(delta)
887
888 /home/user/<string> in _really_apply(self, f, args, kwargs, targets, block, track)
889
890 /path/to/site-packages/IPython/parallel/client/view.pyc in save_ids(f, self, *args, **kwargs)
891 44 n_previous = len(self.client.history)
892 45 try:
893 ---> 46 ret = f(self, *args, **kwargs)
894 47 finally:
895 48 nmsgs = len(self.client.history) - n_previous
896
897 /path/to/site-packages/IPython/parallel/client/view.pyc in _really_apply(self, f, args, kwargs, targets, block, track)
898 529 if block:
899 530 try:
900 --> 531 return ar.get()
901 532 except KeyboardInterrupt:
902 533 pass
903
904 /path/to/site-packages/IPython/parallel/client/asyncresult.pyc in get(self, timeout)
905 101 return self._result
906 102 else:
907 --> 103 raise self._exception
908 104 else:
909 105 raise error.TimeoutError("Result not ready.")
910
911 CompositeError: one or more exceptions from call to method: _execute
912 [0:apply]: ZeroDivisionError: integer division or modulo by zero
913 [1:apply]: ZeroDivisionError: integer division or modulo by zero
914 [2:apply]: ZeroDivisionError: integer division or modulo by zero
915 [3:apply]: ZeroDivisionError: integer division or modulo by zero
916
917 In [82]: %debug
918 > /path/to/site-packages/IPython/parallel/client/asyncresult.py(103)get()
919 102 else:
920 --> 103 raise self._exception
921 104 else:
922
923 # With the debugger running, self._exception is the exceptions instance. We can tab complete
924 # on it and see the extra methods that are available.
925 ipdb> self._exception.<tab>
926 e.__class__ e.__getitem__ e.__new__ e.__setstate__ e.args
927 e.__delattr__ e.__getslice__ e.__reduce__ e.__str__ e.elist
928 e.__dict__ e.__hash__ e.__reduce_ex__ e.__weakref__ e.message
929 e.__doc__ e.__init__ e.__repr__ e._get_engine_str e.print_tracebacks
930 e.__getattribute__ e.__module__ e.__setattr__ e._get_traceback e.raise_exception
931 ipdb> self._exception.print_tracebacks()
932 [0:apply]:
933 Traceback (most recent call last):
934 File "/path/to/site-packages/IPython/parallel/engine/streamkernel.py", line 330, in apply_request
935 exec code in working,working
936 File "<string>", line 1, in <module>
937 File "/path/to/site-packages/IPython/parallel/util.py", line 354, in _execute
938 exec code in globals()
939 File "<string>", line 1, in <module>
824 ZeroDivisionError Traceback (most recent call last)<ipython-input-1-05c9758a9c21> in <module>()
825 ----> 1 1/0
940 826 ZeroDivisionError: integer division or modulo by zero
941 827
942
943 [1:apply]:
944 Traceback (most recent call last):
945 File "/path/to/site-packages/IPython/parallel/engine/streamkernel.py", line 330, in apply_request
946 exec code in working,working
947 File "<string>", line 1, in <module>
948 File "/path/to/site-packages/IPython/parallel/util.py", line 354, in _execute
949 exec code in globals()
950 File "<string>", line 1, in <module>
828 [1:execute]:
829 ---------------------------------------------------------------------------
830 ZeroDivisionError Traceback (most recent call last)<ipython-input-1-05c9758a9c21> in <module>()
831 ----> 1 1/0
951 832 ZeroDivisionError: integer division or modulo by zero
952 833
953
954 [2:apply]:
955 Traceback (most recent call last):
956 File "/path/to/site-packages/IPython/parallel/engine/streamkernel.py", line 330, in apply_request
957 exec code in working,working
958 File "<string>", line 1, in <module>
959 File "/path/to/site-packages/IPython/parallel/util.py", line 354, in _execute
960 exec code in globals()
961 File "<string>", line 1, in <module>
834 [2:execute]:
835 ---------------------------------------------------------------------------
836 ZeroDivisionError Traceback (most recent call last)<ipython-input-1-05c9758a9c21> in <module>()
837 ----> 1 1/0
962 838 ZeroDivisionError: integer division or modulo by zero
963 839
964
965 [3:apply]:
966 Traceback (most recent call last):
967 File "/path/to/site-packages/IPython/parallel/engine/streamkernel.py", line 330, in apply_request
968 exec code in working,working
969 File "<string>", line 1, in <module>
970 File "/path/to/site-packages/IPython/parallel/util.py", line 354, in _execute
971 exec code in globals()
972 File "<string>", line 1, in <module>
840 [3:execute]:
841 ---------------------------------------------------------------------------
842 ZeroDivisionError Traceback (most recent call last)<ipython-input-1-05c9758a9c21> in <module>()
843 ----> 1 1/0
844 ZeroDivisionError: integer division or modulo by zero
845
846 In [82]: %debug
847 > /.../site-packages/IPython/parallel/client/asyncresult.py(125)get()
848 124 else:
849 --> 125 raise self._exception
850 126 else:
851
852 # Here, self._exception is the CompositeError instance:
853
854 ipdb> e = self._exception
855 ipdb> e
856 CompositeError(4)
857
858 # we can tab-complete on e to see available methods:
859 ipdb> e.<TAB>
860 e.args e.message e.traceback
861 e.elist e.msg
862 e.ename e.print_traceback
863 e.engine_info e.raise_exception
864 e.evalue e.render_traceback
865
866 # We can then display the individual tracebacks, if we want:
867 ipdb> e.print_traceback(1)
868 [1:execute]:
869 ---------------------------------------------------------------------------
870 ZeroDivisionError Traceback (most recent call last)<ipython-input-1-05c9758a9c21> in <module>()
871 ----> 1 1/0
973 872 ZeroDivisionError: integer division or modulo by zero
974 873
975 874
@@ -982,21 +881,27 b' All of this same error handling magic even works in non-blocking mode:'
982 881 In [84]: ar = dview.execute('1/0')
983 882
984 883 In [85]: ar.get()
884 [0:execute]:
985 885 ---------------------------------------------------------------------------
986 CompositeError Traceback (most recent call last)
987 /home/user/<ipython-input-21-8531eb3d26fb> in <module>()
988 ----> 1 ar.get()
989
990 /path/to/site-packages/IPython/parallel/client/asyncresult.pyc in get(self, timeout)
991 101 return self._result
992 102 else:
993 --> 103 raise self._exception
994 104 else:
995 105 raise error.TimeoutError("Result not ready.")
996
997 CompositeError: one or more exceptions from call to method: _execute
998 [0:apply]: ZeroDivisionError: integer division or modulo by zero
999 [1:apply]: ZeroDivisionError: integer division or modulo by zero
1000 [2:apply]: ZeroDivisionError: integer division or modulo by zero
1001 [3:apply]: ZeroDivisionError: integer division or modulo by zero
886 ZeroDivisionError Traceback (most recent call last)<ipython-input-1-05c9758a9c21> in <module>()
887 ----> 1 1/0
888 ZeroDivisionError: integer division or modulo by zero
889
890 [1:execute]:
891 ---------------------------------------------------------------------------
892 ZeroDivisionError Traceback (most recent call last)<ipython-input-1-05c9758a9c21> in <module>()
893 ----> 1 1/0
894 ZeroDivisionError: integer division or modulo by zero
895
896 [2:execute]:
897 ---------------------------------------------------------------------------
898 ZeroDivisionError Traceback (most recent call last)<ipython-input-1-05c9758a9c21> in <module>()
899 ----> 1 1/0
900 ZeroDivisionError: integer division or modulo by zero
901
902 [3:execute]:
903 ---------------------------------------------------------------------------
904 ZeroDivisionError Traceback (most recent call last)<ipython-input-1-05c9758a9c21> in <module>()
905 ----> 1 1/0
906 ZeroDivisionError: integer division or modulo by zero
1002 907
General Comments 0
You need to be logged in to leave comments. Login now