专家,请参考以下代码段:
var
aAllTasks : Array [0..1] of ITask //global private var
Procedure SetImage();
begin
//..
//.. Get a URL of an image stored on a server
//..
aAllTasks[0] := TTask.Run(
Procedure
begin
// Download the Image and display the image
end);
aAllTasks[1] := TTask.Run(
Procedure
begin
// Get the rating of the image from a REST server
end);
end;
调试器点击时
aAllTasks[1] := TTask.Run(...);
我得到了
$ 001A30B5的首次机会异常。带有消息''的异常类EThreadNameException。处理APPNAME(126391)
它抛出异常,但它似乎没有崩溃App
这仅在调试/运行iOS应用时发生
iOS 9.2
RS 10 Seattle(更新1)
PA服务器17.0(带有修补程序.. V 8.0.1.52)
Xcode版本7.2(7C68)
导致这种情况的原因以及如何解决?
答案 0 :(得分:3)
您的代码调用class procedure TThread.NameThreadForDebugging(AThreadName: string; AThreadID: TThreadID);
{$IF Defined(MSWINDOWS)}
.... // windows specific code removed
{$ELSE MSWINDOWS}
const
cExceptionMessage = 'Type=$1000,Name=%s,ThreadID=%d,Flags=0';
EMBDBKPRESENTNAME = 'EMB_DBK_PRESENT';
{$IF Defined(MACOS)}
OLDEMBDBKPRESENTNAME = 'EMB_MACOSX_DBK_PRESENT';
{$ENDIF}
begin
{$IF Defined(MACOS)}
if (getenv(EMBDBKPRESENTNAME) <> nil) or (getenv(OLDEMBDBKPRESENTNAME) <> nil) then
{$ELSEIF Defined(ANDROID)}
if (System.DebugHook <> 0) or (getenv(EMBDBKPRESENTNAME) <> nil) then
{$ELSE}
if (getenv(EMBDBKPRESENTNAME) <> nil) then
{$ENDIF}
begin
try
raise EThreadNameException.Create(
Format(cExceptionMessage, [AThreadName, AThreadID]));
except
end;
end;
end;
{$ENDIF !MSWINDOWS}
。看起来像这样:
for weight_dict in d_weights
for key in d_ids:
print weight_dict.get(key, "")
当您希望为线程命名时,将调用此函数。现在,线程对象没有名称。因此,当您为线程命名时,它仅用于调试目的。调试器会跟踪您提供的名称,并将它们与线程ID相关联。然后,当调试器显示有关线程的信息时,它可以从ID中查找名称并将其呈现给您。但这纯粹是一种调试器机制,因为操作系统不支持线程名称。
那么,您如何向调试器发出信号,表示您希望为线程命名。好吧,你抛出一个特定的例外。调试器知道异常并获得处理异常的第一次机会。调试器在异常文本中接收名称和线程ID,并记下该信息。
请注意,会立即吞下该异常,因此不会中断程序的流程。
因此,引发此异常是正常的,由调试器处理,而不是影响程序的行为。奇怪的是,调试器正在破坏该异常。我希望默认情况下调试器会忽略该异常。
OSX的旧QC报告(QC#105310)描述了您正在观察的行为。该问题已关闭,并在XE7中标记为已修复。也许这个问题已经重新出现,或者可能从未针对移动平台进行修复。我建议您向Quality Portal提交错误报告。