#FEATURE by cg
authorClaus Gittinger <cg@exept.de>
Wed, 27 Feb 2019 22:46:59 +0100
changeset 18621 739516228796
parent 18620 b80e38590f3a
child 18622 00e53ab225bf
#FEATURE by cg class: DebugView option to ignore errors such as subclassResponsibility (will allow end-users to continue working without much fuss) class definition added: #addIgnoredErrorForCount:orTimeDuration:orUntilShiftKey:orThisReceiverClass:orCurrentProcess:orIfCalledFromMethod:forAll: #errorSelectors #findContextWithAnySelector:orMClass:orWrapped: #findErrorContext #haltSelectors #ignoreErrorForever #isStoppedAtError #menuForIgnoreAllErrorsIfCalledFromAnyOf #menuForIgnoreErrorIfCalledFromAnyOf #menuForIgnoreErrorIfCalledFromAnyOfForAll: changed: #findHaltingContext #processEvent: #setContext:releaseInspectors: class: DebugView class added: #errorSelectors #haltSelectors #ignoreErrorIn:line:forCount:orTimeDuration:orUntilShiftKey:orReceiverClass:orProcess:orIfCalledFromMethod: #isErrorToBeIgnoredIn:atLineNr:context:modifyEntryCount: #removeInactiveErrors comment/format in: #breakPointMenuSpec #processMenuSpec #withOptionToIgnoreException:do: changed: #enterException: #ignoreError:method:line:parameter:forCount:orTimeDuration:orUntilShiftKey:orReceiverClass:orProcess:orIfCalledFromMethod: #removeInactiveIgnores #stopIgnoringHalts #stopIgnoringHaltsFor:atLineNr: class: DebugView::IgnoredError class definition added: #action #action: class: DebugView::IgnoredError class class: DebugView::IgnoredHaltOrBreakpoint
DebugView.st
--- a/DebugView.st	Tue Feb 26 18:09:03 2019 +0100
+++ b/DebugView.st	Wed Feb 27 22:46:59 2019 +0100
@@ -37,13 +37,13 @@
 		classToDefineIn gotoApplicationActionMethodButton
 		isStoppedInApplicationAction isStoppedAtStatementBreakpoint
 		verboseBacktraceHolder foundRaisingMethod gotoRaisingMethodButton
-		stepInButton infoLabelHolder'
+		stepInButton infoLabelHolder isStoppedAtError'
 	classVariableNames:'CachedDebugger CachedExclusive OpenDebuggers MoreDebuggingDetail
 		DebuggingDebugger DebuggingDebugger2 DebuggingContextWalk
 		DefaultDebuggerBackgroundColor InitialNChainShown IgnoredHalts
 		ShowThreadID LastIgnoreHaltNTimes LastIgnoreHaltDuration
 		LastExtent LastOrigin RememberedCallChain DebuggingDebugger3
-		NumberOfDebuggers DebuggerOnMainDisplayOnly'
+		NumberOfDebuggers DebuggerOnMainDisplayOnly IgnoredErrors'
 	poolDictionaries:''
 	category:'Interface-Debugger'
 !
@@ -64,6 +64,13 @@
 	privateIn:DebugView
 !
 
+DebugView::IgnoredHalt subclass:#IgnoredError
+	instanceVariableNames:'action'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:DebugView
+!
+
 DebugView::IgnoredHaltOrBreakpoint subclass:#IgnoredBreakpoint
 	instanceVariableNames:'parameter'
 	classVariableNames:''
@@ -313,6 +320,75 @@
         orIfCalledFromMethod:nil
 !
 
+ignoreErrorIn:methodOrNil line:lineNrOrNil 
+        forCount:countOrNil orTimeDuration:dTOrNil orUntilShiftKey:untilShiftKey
+        orReceiverClass:receiverClassOrNil orProcess:processOrNil
+        orIfCalledFromMethod:ifCalledFromMethodOrNil
+
+    "remember to ignore an error, either forEver, for some number of invocations
+     or until some time has elapsed.
+     With nil count and time arguments, such an ignored error is reactivated"
+
+    |oldEntry ign|
+
+    IgnoredErrors notNil ifTrue:[
+        self removeInactiveIgnores.
+        oldEntry := IgnoredErrors
+                        detect:[:ign | ign isForMethod:methodOrNil line:lineNrOrNil]
+                        ifNone:nil.
+
+        oldEntry notNil ifTrue:[
+            (processOrNil notNil or:[receiverClassOrNil notNil]) ifTrue:[
+                receiverClassOrNil notNil ifTrue:[
+                    oldEntry ignoreForReceiverClass:receiverClassOrNil.
+                ].
+                processOrNil notNil ifTrue:[
+                    oldEntry ignoreForProcess:processOrNil.
+                ].
+                ^ self.
+            ].
+            IgnoredErrors remove:oldEntry ifAbsent:[].
+        ]
+    ].
+
+    (countOrNil notNil
+      or:[dTOrNil notNil
+      or:[untilShiftKey == true
+      or:[receiverClassOrNil notNil
+      or:[processOrNil notNil
+      or:[ifCalledFromMethodOrNil notNil]]]]]
+    ) ifTrue:[
+        IgnoredErrors isNil ifTrue:[
+            IgnoredErrors := OrderedCollection new.
+        ].
+        ign := IgnoredError new method:methodOrNil lineNumber:lineNrOrNil.
+
+        (countOrNil notNil and:[countOrNil > 0]) ifTrue:[
+            ign ignoreCount:countOrNil.
+        ].
+        (dTOrNil notNil) ifTrue:[
+            ign ignoreEndTime:(Timestamp now + dTOrNil).
+        ].
+        untilShiftKey == true ifTrue:[
+            ign ignoreUntilShiftKeyPressed:true.
+        ].
+        receiverClassOrNil notNil ifTrue:[
+            ign ignoreForReceiverClass:receiverClassOrNil.
+        ].
+        processOrNil notNil ifTrue:[
+            ign ignoreForProcess:processOrNil.
+        ].
+        ifCalledFromMethodOrNil notNil ifTrue:[
+            ign ignoreIfCalledFromMethod:ifCalledFromMethodOrNil.
+        ].
+        ign action:#abort.
+        IgnoredErrors add:ign.
+    ].
+    Smalltalk changed:#ignoredErrors.
+
+    "Created: / 27-02-2019 / 22:22:47 / Claus Gittinger"
+!
+
 ignoreHaltIn:haltingMethod at:lineNrOfHalt
         forCount:countOrNil orTimeDuration:dTOrNil orUntilShiftKey:untilShiftKey
         orReceiverClass:receiverClassOrNil orProcess:processOrNil
@@ -469,6 +545,31 @@
     "Created: / 06-03-2012 / 12:50:30 / cg"
 !
 
+isErrorToBeIgnoredIn:errorMethod atLineNr:lineNrInErrorMethod context:aContext modifyEntryCount:modifyCount
+    "should an error be ignored ?"
+
+    IgnoredErrors isNil ifTrue:[^ false].
+
+    "/ Transcript showCR:'halt/break in ',haltingMethod printString,' at ',lineNrInHaltingMethod printString.
+    IgnoredErrors do:[:ign |
+        (ign isHaltIgnoredInMethod:errorMethod line:lineNrInErrorMethod context:aContext) ifTrue:[
+            Transcript showCR:'Debugger [info]: error ignored: %1' with:ign.
+
+            modifyCount ifTrue:[ ign decrementIgnoreCount ].
+            ign isHaltIgnored ifFalse:[
+                Transcript showCR:'Debugger [info]: no longer ignored (rest count=0)'.
+                IgnoredErrors remove:ign ifAbsent:[].
+            ].
+            ^ true.
+        ].
+    ].
+
+    IgnoredErrors := (IgnoredErrors reject:[:ign | ign isActive not]) asNilIfEmpty.
+    ^ false.
+
+    "Created: / 27-02-2019 / 22:33:37 / Claus Gittinger"
+!
+
 isHaltToBeIgnoredIn:haltingMethod atLineNr:lineNrInHaltingMethod context:aContext modifyEntryCount:modifyCount
     "should a halt be ignored ?"
 
@@ -495,28 +596,55 @@
     "Modified (comment): / 06-03-2012 / 12:51:43 / cg"
 !
 
+removeInactiveErrors
+    "removes ignores for methods which are no longer present"
+
+    IgnoredErrors notNil ifTrue:[
+        IgnoredErrors := IgnoredErrors select:[:i | i isActive].
+    ].
+
+    "Created: / 27-02-2019 / 13:46:46 / Claus Gittinger"
+    "Modified (comment): / 27-02-2019 / 22:26:10 / Claus Gittinger"
+!
+
 removeInactiveIgnores
+    "removes ignores for methods which are no longer present"
+
     IgnoredHalts notNil ifTrue:[
         IgnoredHalts := IgnoredHalts select:[:i | i isActive].
     ].
+    IgnoredErrors notNil ifTrue:[
+        IgnoredErrors := IgnoredErrors select:[:i | i isActive].
+    ].
+
+    "Modified: / 27-02-2019 / 22:26:17 / Claus Gittinger"
 !
 
 stopIgnoringHalts
     "forget about all ignored halts"
 
-    IgnoredHalts := nil.
+    IgnoredHalts := IgnoredErrors := nil.
     Smalltalk changed:#ignoredHalts.
+
+    "Modified: / 27-02-2019 / 22:24:31 / Claus Gittinger"
 !
 
 stopIgnoringHaltsFor:haltingMethod atLineNr:lineNrInHaltingMethod
     "remove the information (if any) about the ignore-state of a halt;
      effectively reenables the breakpoint/halt"
 
-    IgnoredHalts isNil ifTrue:[^ self].
-
-    IgnoredHalts := IgnoredHalts reject:[:ign |
-        (ign isForMethod:haltingMethod line:lineNrInHaltingMethod)
-    ].
+    IgnoredHalts notNil ifTrue:[
+        IgnoredHalts := IgnoredHalts reject:[:ign |
+            (ign isForMethod:haltingMethod line:lineNrInHaltingMethod)
+        ].
+    ].
+    IgnoredErrors notNil ifTrue:[
+        IgnoredErrors := IgnoredErrors reject:[:ign |
+            (ign isForMethod:haltingMethod line:lineNrInHaltingMethod)
+        ].
+    ].
+
+    "Modified: / 27-02-2019 / 22:25:06 / Claus Gittinger"
 ! !
 
 !DebugView class methodsFor:'instance creation / entering'!
@@ -605,7 +733,7 @@
      This is the standard way of entering the debugger;
      sent from error- and halt messages."
 
-    |retValFromDebugger|
+    |retValFromDebugger con|
 
     "/ a quick check for ignored breakpoints here,
     "/ to shortcut the expensive debugger setup.
@@ -624,6 +752,22 @@
             ].
         ].
     ].
+    
+    IgnoredErrors notNil ifTrue:[
+        con := ex suspendedContext sender.
+        (self 
+            isErrorToBeIgnoredIn:(con method)
+            atLineNr:con lineNumber
+            context:con
+            modifyEntryCount:true
+        ) ifTrue:[
+            "/ Transcript showCR:'error at %1[%2] ignored' 
+            "/              with:con method whoString 
+            "/              with:con lineNumber.
+            ^ AbortOperationRequest raise.
+        ].
+    ].
+
     retValFromDebugger := self
         enter:ex returnableSuspendedContext
         withMessage:('[',ex originalSignal class name,']: ',ex descriptionForDebugger)
@@ -637,6 +781,7 @@
     ^ retValFromDebugger
 
     "Modified: / 20-06-2017 / 12:20:22 / cg"
+    "Modified: / 27-02-2019 / 22:45:25 / Claus Gittinger"
 !
 
 enterUnconditional:aContext withMessage:aString mayProceed:mayProceed
@@ -889,7 +1034,7 @@
 
     <resource: #menu>
 
-    ^
+    ^ 
      #(Menu
         (
          (MenuItem
@@ -906,7 +1051,7 @@
           )
          (MenuItem
             label: 'Ignore this Halt/BreakPoint'
-            submenu:
+            submenu: 
            (Menu
               (
                (MenuItem
@@ -920,9 +1065,9 @@
                   itemValue: openIgnoreHaltUntilTimeElapsedDialog
                 )
                (MenuItem
-                  isVisible: isStoppedAtHaltOrBreakPointOrSelectedContextIsWrappedAndHasPreviousIgnoreTime
                   label: 'For Another Timeduration'
                   itemValue: ignoreHaltUntilAnotherTimeDurationElapsed
+                  isVisible: isStoppedAtHaltOrBreakPointOrSelectedContextIsWrappedAndHasPreviousIgnoreTime
                 )
                (MenuItem
                   enabled: isStoppedAtHaltOrBreakPointOrSelectedContextIsWrapped
@@ -960,7 +1105,7 @@
          (MenuItem
             enabled: isStoppedAtBreakPointWithParameter
             label: 'Ignore all BreakPoints with this Parameter'
-            submenu:
+            submenu: 
            (Menu
               (
                (MenuItem
@@ -1008,7 +1153,7 @@
           )
          (MenuItem
             label: 'Ignore all Halts/BreakPoints'
-            submenu:
+            submenu: 
            (Menu
               (
                (MenuItem
@@ -1037,6 +1182,62 @@
             label: '-'
           )
          (MenuItem
+            label: 'Ignore this Error and Abort'
+            submenu: 
+           (Menu
+              (
+               (MenuItem
+                  enabled: isStoppedAtError
+                  label: 'Forever (Until Ignoring is Stopped)'
+                  itemValue: ignoreErrorForever
+                )
+               (MenuItem
+                  enabled: isStoppedAtError
+                  label: 'For Some Time...'
+                  itemValue: openIgnoreErrorUntilTimeElapsedDialog
+                )
+               (MenuItem
+                  label: 'For Another Timeduration'
+                  itemValue: ignoreErrorUntilAnotherTimeDurationElapsed
+                  isVisible: isStoppedAtHaltOrBreakPointOrSelectedContextIsWrappedAndHasPreviousIgnoreTime
+                )
+               (MenuItem
+                  enabled: isStoppedAtError
+                  label: 'For the Next N Times...'
+                  itemValue: openIgnoreErrorNTimesDialog
+                )
+               (MenuItem
+                  enabled: isStoppedAtError
+                  label: 'Until Shift-Key is Pressed'
+                  itemValue: ignoreErrorUntilShiftKeyIsPressed
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  enabled: isStoppedAtError
+                  label: 'In Current Process'
+                  itemValue: ignoreErrorForCurrentProcess
+                )
+               (MenuItem
+                  enabled: isStoppedAtError
+                  label: 'For this Receiver Class'
+                  itemValue: ignoreErrorForThisReceiverClass
+                )
+               (MenuItem
+                  enabled: isStoppedAtError
+                  label: 'If Called From'
+                  submenuChannel: menuForIgnoreErrorIfCalledFromAnyOf
+                )
+               )
+              nil
+              nil
+            )
+          )
+         (MenuItem
+            label: '-'
+          )
+         (MenuItem
             enabled: canAddBreakpoint
             label: 'Add Breakpoint'
             itemValue: addBreakpoint
@@ -1057,8 +1258,6 @@
         nil
         nil
       )
-
-    "Modified: / 09-11-2018 / 20:43:16 / Claus Gittinger"
 !
 
 classMenuSpec
@@ -1397,12 +1596,13 @@
 
     <resource: #menu>
 
-    ^
+    ^ 
      #(Menu
         (
          (MenuItem
             label: 'Continue'
             itemValue: doContinue
+            shortcutKey: CtrlReturn
           )
          (MenuItem
             label: 'Next (Line-Step)'
@@ -1417,7 +1617,7 @@
           )
          (MenuItem
             label: 'After 5 Seconds'
-            submenu:
+            submenu: 
            (Menu
               (
                (MenuItem
@@ -1924,12 +2124,35 @@
     "Modified: / 01-02-2018 / 23:35:30 / stefan"
 ! !
 
+!DebugView class methodsFor:'private'!
+
+errorSelectors
+    "these can be ignored via the menu"
+    
+    ^ #( 
+        #'subclassResponsibility' #'subclassResponsibility:' 
+    ).
+
+    "Created: / 27-02-2019 / 13:38:12 / Claus Gittinger"
+!
+
+haltSelectors
+    "these can be ignored via the menu"
+    
+    ^ #( #'halt' #'halt:' 
+         #'breakPoint:' #'breakPoint:info:' #'break'
+    ).
+
+    "Modified (format): / 27-01-2012 / 11:10:00 / cg"
+    "Modified (comment): / 27-02-2019 / 13:38:25 / Claus Gittinger"
+! !
+
 !DebugView class methodsFor:'utilities'!
 
 withOptionToIgnoreException:exceptionOrHandlerSet do:aBlock
     "execute aBlock; 
      if any from exceptionOrHandlerSet is raised during the execution,
-     open a confitmation dialog, asking if the debugger should be entered.
+     open a confirmation dialog, asking if the debugger should be entered.
      For halts/breakpoints, honors the ignored halt/break list;
      also, two checkboxes are added, to also ignore them in the future"
 
@@ -2060,6 +2283,8 @@
      ControlInterrupt withOptionToIgnore:(HaltInterrupt,Error) do:[self halt]
      ControlInterrupt withOptionToIgnore:(HaltInterrupt,Error) do:[self error]
     "
+
+    "Modified (comment): / 27-02-2019 / 22:28:58 / Claus Gittinger"
 ! !
 
 !DebugView methodsFor:'accessing'!
@@ -6830,6 +7055,16 @@
     "Created: / 06-03-2012 / 12:35:22 / cg"
 !
 
+ignoreErrorForever
+    self
+        addIgnoredErrorForCount:-1 orTimeDuration:nil orUntilShiftKey:false
+        orThisReceiverClass:false orCurrentProcess:false
+        orIfCalledFromMethod:nil
+        forAll:false.
+
+    "Created: / 27-02-2019 / 12:40:38 / Claus Gittinger"
+!
+
 ignoreHaltForCurrentProcess
     self
         addIgnoredHaltForCount:nil orTimeDuration:nil orUntilShiftKey:false
@@ -6894,6 +7129,14 @@
     ^ self menuForIgnoreBreakpointIfCalledFromAnyOfForAll:true
 !
 
+menuForIgnoreAllErrorsIfCalledFromAnyOf
+    <resource: #programMenu >
+
+    ^ self menuForIgnoreErrorIfCalledFromAnyOfForAll:true
+
+    "Created: / 27-02-2019 / 12:38:59 / Claus Gittinger"
+!
+
 menuForIgnoreBreakpointIfCalledFromAnyOf
     <resource: #programMenu >
 
@@ -6935,6 +7178,51 @@
     ^ m
 !
 
+menuForIgnoreErrorIfCalledFromAnyOf
+    <resource: #programMenu >
+
+    ^ self menuForIgnoreErrorIfCalledFromAnyOfForAll:false
+
+    "Created: / 27-02-2019 / 12:39:12 / Claus Gittinger"
+!
+
+menuForIgnoreErrorIfCalledFromAnyOfForAll:forAllHaltsBoolean
+    <resource: #programMenu >
+
+    |m count already|
+
+    m := Menu new.
+    count := 0.
+    already := IdentitySet new.
+
+    contextArray do:[:con |
+        |mthd cls sel|
+
+        mthd := con method.
+        mthd notNil ifTrue:[
+            mthd isWrapped ifFalse:[
+                (already includes:already) ifFalse:[
+                    already add:mthd.
+                    m addItem:(MenuItem
+                                label: (mthd whoString)
+                                itemValue: [ forAllHaltsBoolean
+                                                ifTrue:[self ignoreErrorIfCalledFromMethod:mthd]
+                                                ifFalse:[self ignoreAllErrorsIfCalledFromMethod:mthd]
+                                           ]
+                                translateLabel: false).
+                    count := count + 1.
+                    (count > 20) ifTrue:[
+                        ^ m
+                    ].
+                ]
+            ]
+        ]
+    ].
+    ^ m
+
+    "Created: / 27-02-2019 / 12:39:36 / Claus Gittinger"
+!
+
 openBreakPointBrowser
     Tools::BreakpointBrowser open
 
@@ -7122,6 +7410,14 @@
     ^ busy
 !
 
+errorSelectors
+    "obsolete - please use class method"
+    
+    ^ self class errorSelectors
+
+    "Modified (comment): / 27-02-2019 / 22:39:41 / Claus Gittinger"
+!
+
 exclusive:aBoolean
     exclusive := aBoolean
 !
@@ -7194,12 +7490,11 @@
 !
 
 haltSelectors
-    ^ #( #'halt' #'halt:' 
-         #'breakPoint:' #'breakPoint:info:' #'break'
-    ).
-
-    "Modified (format): / 27-01-2012 / 11:10:00 / cg"
-    "Modified (format): / 20-02-2019 / 21:50:16 / Claus Gittinger"
+    "obsolete - please use class method"
+
+    ^ self class haltSelectors
+
+    "Modified (comment): / 27-02-2019 / 22:39:47 / Claus Gittinger"
 !
 
 interruptProcessWith:aBlock
@@ -7735,6 +8030,13 @@
     "Created: / 06-03-2012 / 12:16:56 / cg"
 !
 
+isStoppedAtError
+    ^ isStoppedAtError "/ ^ self isStoppedAtHaltOrBreakPoint not
+
+    "Created: / 27-02-2019 / 12:36:35 / Claus Gittinger"
+    "Modified: / 27-02-2019 / 22:18:04 / Claus Gittinger"
+!
+
 isStoppedAtHaltOrBreakPoint
     ^ isStoppedAtHaltOrBreakPoint
 !
@@ -7772,6 +8074,47 @@
 
 !DebugView methodsFor:'private-breakpoints'!
 
+addIgnoredErrorForCount:countOrNil
+        orTimeDuration:dTOrNil orUntilShiftKey:untilShiftKey
+        orThisReceiverClass:forThisReceiverClass orCurrentProcess:forCurrentProcess
+        orIfCalledFromMethod:ifCalledForMethodOrNil
+        forAll:aBoolean
+
+    |errorContext errorMethod lineNrOfError receiverClassOrNil processOrNil|
+
+    aBoolean ifTrue:[
+        errorMethod := #all
+    ] ifFalse:[
+        errorContext := self findErrorContext.
+        errorContext isNil ifTrue:[
+            Transcript showCR:'no error context found'.
+            ^ self
+        ].
+
+        errorMethod := errorContext method.
+        lineNrOfError := errorContext lineNumber.
+        (lineNrOfError isNil or:[lineNrOfError <= 0]) ifTrue:[
+            Transcript showCR:'no Error lineNr found'.
+            ^ self
+        ].
+        forThisReceiverClass ifTrue:[
+            receiverClassOrNil := errorContext receiver class
+        ].
+        forCurrentProcess ifTrue:[
+            processOrNil := Processor activeProcess
+        ].
+    ].
+
+    self class
+        ignoreErrorIn:errorMethod line:lineNrOfError
+        forCount:countOrNil orTimeDuration:dTOrNil orUntilShiftKey:untilShiftKey
+        orReceiverClass:receiverClassOrNil orProcess:processOrNil
+        orIfCalledFromMethod:ifCalledForMethodOrNil
+
+    "Created: / 27-02-2019 / 12:42:12 / Claus Gittinger"
+    "Modified: / 27-02-2019 / 22:23:17 / Claus Gittinger"
+!
+
 addIgnoredHaltForCount:countOrNil
         orTimeDuration:dTOrNil orUntilShiftKey:untilShiftKey
         orThisReceiverClass:forThisReceiverClass orCurrentProcess:forCurrentProcess
@@ -7826,40 +8169,62 @@
     ^ m notNil and:[m isEnabled:#removeBreakpoint]
 !
 
-findHaltingContext
-    |haltSelectors|
-
-    haltSelectors := self haltSelectors.
-
-    contextArray keysAndValuesDo:[:idx :con |
+findContextWithAnySelector:selectors orMClass:mClass orWrapped:orWrappedBoolean
+    |con|
+
+    con := firstContext.
+    [con notNil] whileTrue:[
+    "/ contextArray keysAndValuesDo:[:idx :con |
         |sel con2 sel2 method|
 
         sel := con selector.
-        (haltSelectors includes:sel) ifTrue:[
+        (selectors includes:sel) ifTrue:[
             (method := con method) notNil ifTrue:[
                 method mclass == Object ifTrue:[
-                    con2 := contextArray at:idx+1.
+                    con2 := con sender. "/ contextArray at:idx+1.
                     sel2 := con2 selector.
-                    (haltSelectors includes:sel2) ifTrue:[
+                    (selectors includes:sel2) ifTrue:[
                         con2 method mclass == Object ifTrue:[
-                            ^ contextArray at:idx+2.
+                            ^ con2 sender "/ contextArray at:idx+2.
                         ]
                     ].
-                    ^ contextArray at:idx+1
+                    ^ con2. "/ contextArray at:idx+1
                 ].
-                method mclass == Breakpoint ifTrue:[
-(contextArray at:idx+1) infoPrintCR.
-                    ^ contextArray at:idx+1
+                (mClass notNil and:[method mclass == mClass]) ifTrue:[
+                    "/ (contextArray at:idx+1) infoPrintCR.
+                    ^ con sender "/ contextArray at:idx+1
                 ].
             ].
         ].
-        con method isWrapped ifTrue:[
+        (orWrappedBoolean and:[con method isWrapped]) ifTrue:[
             ^ con
         ].
+        con := con sender.
     ].
     ^ nil
 
+    "Created: / 27-02-2019 / 13:40:25 / Claus Gittinger"
+    "Modified: / 27-02-2019 / 22:20:27 / Claus Gittinger"
+!
+
+findErrorContext
+    ^ self
+        findContextWithAnySelector:(self class errorSelectors) 
+        orMClass:nil 
+        orWrapped:false
+
+    "Created: / 27-02-2019 / 13:41:18 / Claus Gittinger"
+    "Modified: / 27-02-2019 / 22:37:14 / Claus Gittinger"
+!
+
+findHaltingContext
+    ^ self
+        findContextWithAnySelector:(self class haltSelectors) 
+        orMClass:Breakpoint 
+        orWrapped:true
+
     "Modified: / 27-01-2012 / 11:06:02 / cg"
+    "Modified: / 27-02-2019 / 22:39:03 / Claus Gittinger"
 !
 
 ignoreBreakpoints
@@ -8127,17 +8492,21 @@
 
     |con sel text method caller caller2 called called2 m count c cc sndr
      suspendContext calledBySuspendContext nm h calledContext show2
-     alreadyInApplicationCode verboseBacktrace|
+     alreadyInApplicationCode verboseBacktrace
+     errorSelectors haltSelectors|
 
 "/    (contextArray size > 0 and:[aContext == (contextArray at:1)]) ifTrue:[
 "/        "no change"
 "/        ^ false
 "/    ].
 
+    errorSelectors := self class errorSelectors.
+    haltSelectors := self class haltSelectors.
+    
     isStoppedAtHaltOrBreakPoint := isStoppedAtBreakPointWithParameter := false.
     foundRaisingMethod := false.
     isStoppedInModalDialog := isStoppedInApplicationAction := alreadyInApplicationCode := false.
-    isStoppedAtStatementBreakpoint := false.
+    isStoppedAtStatementBreakpoint := isStoppedAtError := false.
     firstContext := aContext.
     verboseBacktrace := self verboseBacktraceHolder value.
 
@@ -8196,7 +8565,7 @@
         con notNil ifTrue:[
             "/ hide the halt implementation
             sel := con selector.
-            (self haltSelectors includes:sel) ifTrue:[
+            (haltSelectors includes:sel) ifTrue:[
                 (method := con method) notNil ifTrue:[
                     method mclass == Object ifTrue:[
                         (sel isSymbol and:[ sel startsWith:'breakPoint:']) ifTrue:[
@@ -8221,6 +8590,9 @@
                     ].
                 ].
             ].
+            (errorSelectors includes:sel) ifTrue:[
+                isStoppedAtError := true.
+            ].
         ].
 
         (verboseBacktrace not or:[ hideSupportCode]) ifTrue:[
@@ -8229,8 +8601,11 @@
                 and:[ con isBlockContext not
                 and:[ con method notNil
                 and:[ (con method shouldBeSkippedInDebuggersWalkBack)
-                and:[ (self haltSelectors includes: con selector) not]]]]
+                and:[ (haltSelectors includes: con selector) not]]]]
             ] whileTrue:[
+                (errorSelectors includes:con selector) ifTrue:[
+                    isStoppedAtError := true.
+                ].
                 "/ Transcript show:'xx '; showCR:con.
                 calledContext := con.
                 con := con sender
@@ -8252,7 +8627,10 @@
             DebuggingContextWalk == true ifTrue:[ '---' print. con printCR ].
 
             sel := con selector.
-            (self haltSelectors includes:sel) ifTrue:[
+            (errorSelectors includes:sel) ifTrue:[
+                isStoppedAtError := true.
+            ].
+            (haltSelectors includes:sel) ifTrue:[
                 (method := con method) notNil ifTrue:[
                     method mclass == Object ifTrue:[
                         (sel isSymbol and:[sel startsWith:'breakPoint:']) ifTrue:[
@@ -8465,7 +8843,7 @@
 
     "Created: / 14-12-1995 / 19:10:31 / cg"
     "Modified: / 30-11-2017 / 12:16:08 / cg"
-    "Modified: / 10-10-2018 / 16:24:32 / Claus Gittinger"
+    "Modified: / 27-02-2019 / 22:38:55 / Claus Gittinger"
 !
 
 setContextSkippingInterruptContexts:aContext
@@ -9549,7 +9927,6 @@
         anEvent isKeyPressEvent ifTrue:[
             key := anEvent key.
             rawKey := anEvent rawKey.
-
             inCodeView := (focusView == codeView
                           or:[focusView isComponentOf:codeView]).
             inCodeView ifTrue:[
@@ -9561,6 +9938,11 @@
                         withArguments:#().
                     ^ true
                 ].
+                "/ (key == #CtrlReturn) ifTrue:[
+                "/     "/ eat it
+                "/     "/ self sensor enqueueMessage:#doContinue for:self arguments:nil.
+                "/     ^ true
+                "/ ].     
             ].
         ].
 
@@ -9584,6 +9966,8 @@
 
     ].
     ^ false
+
+    "Modified: / 27-02-2019 / 12:28:55 / Claus Gittinger"
 !
 
 setCurrentMethod:aMethodOrNil
@@ -10482,6 +10866,16 @@
     ^ self isHaltIgnored  "/ unconditionally
 ! !
 
+!DebugView::IgnoredError methodsFor:'accessing'!
+
+action
+    ^ action
+!
+
+action:something
+    action := something.
+! !
+
 !DebugView::IgnoredBreakpoint class methodsFor:'instance creation'!
 
 parameter:aParameter