Rest 当响应代码为300或更高时,Execute退出线程

Rest 当响应代码为300或更高时,Execute退出线程,rest,delphi,rest-client,delphi-10.4-sydney,Rest,Delphi,Rest Client,Delphi 10.4 Sydney,我需要检查RestResponse中的特定状态代码,但是当状态代码不是200时,RestRequest.Execute似乎会生成一个EHTTPProtocolException 我看了一下文档,它说 我很难理解为什么会出现EHTTPProtocolException。我怎样才能忽略或抑制它?我确实检查了它是否只是调试器,但是代码在执行时停止,即使是在发布版本中,或者在独立运行时 我的代码如下: 过程TdmWebsockets.GetRustMapURLconst连接:TsgcWSConnecti

我需要检查RestResponse中的特定状态代码,但是当状态代码不是200时,RestRequest.Execute似乎会生成一个EHTTPProtocolException

我看了一下文档,它说

我很难理解为什么会出现EHTTPProtocolException。我怎样才能忽略或抑制它?我确实检查了它是否只是调试器,但是代码在执行时停止,即使是在发布版本中,或者在独立运行时

我的代码如下:

过程TdmWebsockets.GetRustMapURLconst连接:TsgcWSConnection;常量数据:字符串; 开始 var jdata:=TJSONObject.ParseJSONValueData; var restClient:=TRESTClient.CreateSelf; var response:=TRESTResponse.CreateSelf; var restRequest:=TRESTRequest.CreateSelf; 尝试 var isStaging:=jdata.GetValue'data.staging'; var isbarlean:=jdata.GetValue'data.barlean'; var seed:=jdata.GetValue'data.seed'; 变量大小:=jdata.GetValue'data.size'; restRequest.Client:=restClient; restRequest.Response:=重新响应; restClient.BaseURL:='https://rustmaps.com/api/v2/maps/'+seed.ToString+'/'+size.ToString; restClient.RaiseExceptionOn500:=False; AddParameter'staging',booltestrisstaging,True; restRequest.AddParameter'barning',BoolToStrisBarren,True; restRequest.Params.AddHeader'X-API-Key','redact'; restRequest.Method:=TRESTRequestMethod.rmPOST; 写在“之前”; 重新请求执行; 写在“之后”; var编写器:TJsonTextWriter; var StringWriter:TStringWriter; 尝试 StringWriter:=TStringWriter.Create; 编写器:=TJsonTextWriter.CreateStringWriter; Writer.Formatting:=TJsonFormatting.Indented; Writer.WriteStartObject; ///////////////////////////////////////////// Writer.WritePropertyName'command'; Writer.WriteValueCOMMAND_GETMAP; ///////////////////////////////////////////// 如果restResponse.Status.SuccessOK_200或restResponse.Status.ClientErrorDuplicate_409,则 开始 写“200行”; Writer.WritePropertyName'success'; Writer.WriteValueTrue; ///////////////////////////////////////////// var mapID:=resresponse.JSONValue.GetValue'mapID'; Writer.WritePropertyName'mapID'; Writer.WriteValuemapID; ///////////////////////////////////////////// 终止 否则,如果Response.Status.ClientErrorBadRequest_400,则 开始 写“400行”; ///////////////////////////////////////////// Writer.WritePropertyName'success'; Writer.WriteValueFalse; ///////////////////////////////////////////// 变量原因:=Response.JSONValue.GetValue'reason'; Writer.WritePropertyName'reason'; Writer.WriteValuereason; ///////////////////////////////////////////// 终止 Writer.WriteEndObject; WritelnStringWriter.ToString; Connection.WriteDataStringWriter.ToString; 最后 StringWriter.免费; 作者:免费; 终止 最后 restRequest.Free; 重新响应。免费; restClient.Free; jdata.Free; 终止 终止 编辑: 当单击异常窗口上的“中断”按钮时,它会将我带到Rest.HttpClient中的Execute方法,尽管它没有添加到uses中。单步执行显示它在Rest.HttpClient中执行,而不是在Rest.Client中执行

尝试使用时,请尝试。。除非我被要求使用Rest.HttpClient来获取异常类型EHTTPProtocolException。使用try时。。但它仍然抛出异常。我知道调试器仍然会捕获它,但代码永远不会在try中运行。。exception并在异常thows之后停止。

如果异常正在转义TRestRequest。请在代码中执行,然后通过try..exception捕获它。如果需要,EHTTPProtocolException有一个属性可以查看

try..except根本不能阻止引发异常。除非将调试器配置为忽略异常,否则调试器仍将显示引发的异常。但是您的代码将能够捕获异常并根据需要进行处理。如果调试器因异常而中断,只需按IDE上的Run按钮或键盘上的F9继续执行,异常将传递给代码中最近的匹配异常处理程序

例如:

尝试 重新请求执行; 除了 //吞下所有例外。。。 终止 然后继续,不需要更新uses子句-除非您希望代码忽略非EHTTPProtocolException异常,并让它们按您应该的方式向上传播调用堆栈,在这种情况下,您可以使用以下方法:

使用 …,REST.HttpClient; 尝试 重新请求执行; 除了 在E上:异常确实开始 如果E不是EHTTPProtocolException,则开始 //不要接受未知的非HTTP错误。。。 类风湿关节炎 ise; 终止 //接受HTTP错误并让后续代码检查状态。。。 终止 终止 或:

使用 …,REST.HttpClient; 尝试 重新请求执行; 除了 在E:EHTTPProtocolException上确实开始 //接受HTTP错误并让后续代码检查状态。。。 终止 在E上:异常确实开始 //不要接受未知的非HTTP错误。。。 提升 终止 终止 或:

使用 …,REST.HttpClient; 尝试 重新请求执行; 除了 关于E:EHTTPProtocolException do; //只接受HTTP错误并让后续代码检查状态。。。 终止 但是,如果异常没有转义到代码中的TRestRequest.Execute,那么这个问题就没有意义了。异常将在Execute内部处理,不需要尝试..除非在代码中。如果您不想在调试代码时看到异常,请简单地继续。

如果异常正在转义TRestRequest.Execute到您的代码中,请尝试捕获它。..exception。如果需要,EHTTPProtocolException有一个属性可以查看

try..except根本不能阻止引发异常。除非将调试器配置为忽略异常,否则调试器仍将显示引发的异常。但是您的代码将能够捕获异常并根据需要进行处理。如果调试器因异常而中断,只需按IDE上的Run按钮或键盘上的F9继续执行,异常将传递给代码中最近的匹配异常处理程序

例如:

尝试 重新请求执行; 除了 //吞下所有例外。。。 终止 然后继续,不需要更新uses子句-除非您希望代码忽略非EHTTPProtocolException异常,并让它们按您应该的方式向上传播调用堆栈,在这种情况下,您可以使用以下方法:

使用 …,REST.HttpClient; 尝试 重新请求执行; 除了 在E上:异常确实开始 如果E不是EHTTPProtocolException,则开始 //不要接受未知的非HTTP错误。。。 提升 终止 //接受HTTP错误并让后续代码检查状态。。。 终止 终止 或:

使用 …,REST.HttpClient; 尝试 重新请求执行; 除了 在E:EHTTPProtocolException上确实开始 //接受HTTP错误并让后续代码检查状态。。。 终止 在E上:异常确实开始 //不要接受未知的非HTTP错误。。。 提升 终止 终止 或:

使用 …,REST.HttpClient; 尝试 重新请求执行; 除了 关于E:EHTTPProtocolException do; //只接受HTTP错误并让后续代码检查状态。。。 终止
但是,如果异常没有转义到代码中的TRestRequest.Execute,那么这个问题就没有意义了。异常将在Execute内部处理,不需要尝试..除非在代码中。如果您不想在调试代码时看到异常,那么请简单地继续。

我误解了问题所在,并将重点放在抛出的HTTPException上,而不是真正的问题上。似乎由于我的应用程序是一个控制台应用程序,并且NotifyEvent对于sgcWebsockets中的线程是不同步的,所以每次调用TCustomRESTClient.HandleEvent时,线程都会退出。在本例中,它被调用并实际作为restRequest.SynchronizedEvents执行。默认情况下,它被设置为true,但应该为false

因此,解决办法就是简单地做:

restRequest.SynchronizedEvents:=False;
我误解了问题是什么,只关注抛出的HTTPException,而不是真正的问题。似乎由于我的应用程序是一个控制台应用程序,并且NotifyEvent对于sgcWebsockets中的线程是不同步的,所以每次调用TCustomRESTClient.HandleEvent时,线程都会退出。在本例中,它被调用并实际作为restRequest.SynchronizedEvents执行。默认情况下,它被设置为true,但应该为false

因此,解决办法就是简单地做:

restRequest.SynchronizedEvents:=False;
@Remylebeau我编辑了我的问题,以表明我也尝试过这一点,并对正在发生的事情添加了更好的解释。@Remylebeau我编辑了我的问题,以表明我也尝试过这一点,并对正在发生的事情添加了更好的解释。我相信在这种情况下,开发人员在调试过程中不希望出现异常。仍将引发EHTTPProtocolException,但这被困在REST.Client.TCustomRESTRequest.Execute方法中,其中处理EHTTPProtocolException。错误代码>=500和Client.raiseExceptions500。出于这个原因,我通常将IDE设置为忽略EHTTPProtocolException。@RandySill说得很好。我已经更新了我的答案。不幸的是,事实并非如此。最终发生的是,在Rest.Client中执行HandleEvent之后,正在运行的线程立即退出。我相信在这种情况下,开发人员在调试过程中不会期望出现异常。仍将引发EHTTPProtocolException,但这被困在REST.Client.tcustomRestreq中
est.Execute方法,其中处理EHTTPProtocolException,E.ErrorCode>=500和Client.RaiseExceptionsOn500。出于这个原因,我通常将IDE设置为忽略EHTTPProtocolException。@RandySill说得很好。我已经更新了我的答案。不幸的是,事实并非如此。最终发生的是,在Rest.Client中执行HandleEvent之后,正在运行该线程的线程立即退出。