Недокументированная функция Internal`HandlerBlock
( непокрытая Максима Рытина) применима здесь:
Off[FindMaximum::"nrnum"]
Internal`HandlerBlock[{"Message", Print},
Message[FindMaximum::"nrnum", arg1, arg2, arg3]]
(* => Hold[Message[FindMaximum::nrnum,arg1,arg2,arg3],False]*)
Другой тип обработчика - «MessageTextFilter».«Message» вызывается для каждого сгенерированного сообщения и передает один аргумент в виде Hold [..., ...] в функцию-обработчик, а для второго элемента установлено значение False для сообщений, для которых произошла ошибка.«MessageTextFilter» вызывается для сообщений, которые фактически распечатываются, и вызывает функцию с тремя аргументами.
Максим Рытин
Другая возможность заключается в изменении $MessagePrePrint
такимспособ, которым он будет печатать сообщения, содержащие встроенные ячейки с усеченными аргументами, которые могут быть расширены до полных аргументов при оценке.Это можно сделать с помощью Interpretation
:
truncatingRules = {lst : {x_, y__} /;
MatrixQ[lst, NumberQ] && Length[lst] > 3 :>
{x /. v : {a_, b__} /; Length[v] > 3 :>
{a,
Interpretation[Style[Skeleton[Length[{b}]], Gray],
Sequence @@ {b}]},
Interpretation[Style[Skeleton[Length[{y}]], Gray],
Sequence @@ {y}]},
lst : {x_, y__} /; VectorQ[lst, NumberQ] && Length[lst] > 3 :>
{x, Interpretation[Style[Skeleton[Length[{y}]], Gray],
Sequence @@ {y}]}};
InlineCellInsideMessage[expr_] :=
Style[DisplayForm[
Cell[BoxData[MakeBoxes[expr, StandardForm]], "Input"]],
FontWeight -> Bold, FontFamily -> "Courier", Background -> Yellow,
FontColor -> Red, FontSize -> 12, StripOnInput -> True,
AutoNumberFormatting -> True, ShowStringCharacters -> True]
$MessagePrePrint =
Function[expr,
If[TrueQ[ByteCount[Unevaluated[expr]] < $OutputSizeLimit/20.],
InlineCellInsideMessage[expr],
InlineCellInsideMessage[expr /. truncatingRules]
]]
Конечно, вышеприведенная версия $MessagePrePrint
является всего лишь черновиком, но она иллюстрирует основную идею.