是否可以看到被截断的完整版Message
? IE,我在0.105309,0.394682,<<20>>,<<20>>,<<20>>,0.394631
窗口看到了Messages
的内容。我猜<<20>>
代表省略的部分,我如何得到整个东西?
对50个变量的问题调用的函数是FindMaximum。
更新的 Simon的回答似乎适用于一般消息,我也发现了一种特定于捕获FindMaximum“非实数”消息的方法。
要获得导致FindMaximum失败且带有“非实数”消息的点,您可以执行以下操作(重新定义Message
是我能找到的唯一方法,因为该点未传递给{{ 1}}或EvaluationMonitor
)
StepMonitor
答案 0 :(得分:10)
我不确定您是否可以恢复已生成的长消息。由于$MessageList
和Message[]
仅存储消息名称,而不是传递给它们的参数。
要阻止Short[]
自动应用于Unset[$MessagePrePrint]
的邮件。它的默认值是Automatic
- 无论需要什么。
不是一直打印长消息,而是使用像
这样的东西General::longmsg="A long message (`1`) was produced. The full message has been saved in `2`";
$MessagePrePrint=With[{bc=ByteCount[#]},If[bc>65536,
With[{fn=FileNameJoin[{$HomeDirectory,StringJoin["MmaMsg",ToString/@DateList[]]}]},
Put[#,fn];Message[General::longmsg,bc,Row[{fn}]];Short[Shallow[#],1]],
#]]&;
除非ByteCount
太大(&gt; 65536),否则这将正常打印出该消息,在这种情况下,它会打印出两条消息:第一条消息通知您生成了一条大消息,并为您提供文件保存位置。第二个是完整消息的截断版本。
答案 1 :(得分:2)
我现在不在正确的计算机前面,因此我无法对其进行测试......但我认为您可以完全自定义消息处理行为,例如:
Block[{Message = f}, ...]
例如,您可以使用
f[args___] := Print[{args}];
再次,现在不在Mathematica面前。请随时到维基编辑这个答案。
答案 2 :(得分:2)
未记录的函数Internal`HandlerBlock
(Maxim {名称} uncovered)适用于此处:
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” 实际上是打印并用三个参数调用函数。
Maxim Rytin
另一种可能性是以这样一种方式修改$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
只是草稿,但它说明了主要想法。
答案 3 :(得分:0)