Недокументированная функция Internal`HandlerBlock
(раскрыта Максимом Рытиным) здесь применимо:
Off[FindMaximum::"nrnum"]
Internal`HandlerBlock[{"Message", Print},
Message[FindMaximum::"nrnum", arg1, arg2, arg3]]
(* => Hold[Message[FindMaximum::nrnum,arg1,arg2,arg3],False]*)
Другой тип обработчика — «MessageTextFilter». «Сообщение» вызывается для каждого сгенерированного сообщения и передает один аргумент формы 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
— это всего лишь набросок, но он иллюстрирует основную идею.
person
Alexey Popkov
schedule
17.08.2011
Off[]
). Смотрите мои комментарии ниже. - person Simon   schedule 25.11.2010Internal`HandlerBlock
позволяет перехватывать сообщения, которые отключены. Смотрите мой ответ ниже. - person Alexey Popkov   schedule 17.08.2011