This code block is from production code running on 12.1.1.0. It removes everything remaining in evaluation queue, helping to simulate "Abort Evaluation" from Evaluation menu. Then it uses nice trick from Kuba to clear out very last evaluation using "ScheduledTask"
SelectionMove[EvaluationNotebook[], All, Notebook,
AutoScroll -> False];
FrontEndExecute@FrontEndToken@"RemoveFromEvaluationQueue";
NotebookLocate[currentCellTag];
SessionSubmit@ScheduledTask[$Pre =., 1.];
$Pre = Abort[] &;
Abort[]
Later when I have some time I will wrap in a function and test for your use case.
For those interested here is a function that checks for messages coming from a statement, and pops up a "Continue|Abort|Pause" dialog upon such messages, using the code block above.
checkForMessagesDialogOptionToFullAbortNotebook::usage =
"checkForMessagesDialogOptionToFullAbortNotebook";
SetAttributes[checkForMessagesDialogOptionToFullAbortNotebook,
HoldFirst];
checkForMessagesDialogOptionToFullAbortNotebook[expression0_,
currentCellTag_String] := Block[
{evd, dialogReturn, checkboxState},
evd = EvaluationData[expression0];
If[Length@evd["Messages"] > 0,
(
SetSelectedNotebook[EvaluationNotebook[]];
NotebookLocate[currentCellTag];
checkboxState = False;
dialogReturn = DialogInput[
Column[{
currentCellTag,
"Please note error messages in red.",
"Program is misbehaving. Do you wish to abort?",
"(Cancel to continue.)",
Row[{
Checkbox[Dynamic[checkboxState]],
" Add 20 second pause"
}],
Row[{
DefaultButton[DialogReturn["abort"]],
CancelButton[DialogReturn["continue"]]
}]
}, Center],
Modal -> True,
WindowTitle -> "abort misbehaving program?"
];
If[dialogReturn === "abort",
(* very clever code from https://mathematica.stackexchange.com/a/
99582/13738 *)
(* for programmically doing the equivilant to menu Evaluation |
Abort Evaluation *)
If[checkboxState, Pause[20.]];
SelectionMove[EvaluationNotebook[], All, Notebook,
AutoScroll -> False];
FrontEndExecute@FrontEndToken@"RemoveFromEvaluationQueue";
NotebookLocate[currentCellTag];
SessionSubmit@ScheduledTask[$Pre =., 1.];
$Pre = Abort[] &;
Abort[]
];
If[dialogReturn === "continue" && checkboxState, Pause[20.]]
)
];
evd
]
assertFunction[HoldComplete@Assert[code_, tag_]] := (Print[tag]; Abort[]); $AssertFunction = assertFunction[##] &– Michael E2 Sep 22 '19 at 14:47