delphi无效的枚举值'_24170';

delphi无效的枚举值'_24170';,delphi,enums,Delphi,Enums,我有我的dll,它包含函数: function GetPdfReport( //this is string representation of MyEnum AStringParam : Pchar ): TByteDynArray; stdcall; export; var //my vars begin try try //i try to pass incorrect string value on purpose to get exception

我有我的dll,它包含函数:

function GetPdfReport(
  //this is string representation of MyEnum
  AStringParam : Pchar
): TByteDynArray; stdcall; export;

var
//my vars

begin
  try
    try
      //i try to pass incorrect string value on purpose to get exception
      MyEnumVariable := TRttiEnumerationType.GetValue<MyEnum>(AStringParam);

      //code hide
    except
      on E : Exception do
        begin
          //log error
          Log.Error(E.ClassName + ' : ' + E.Message, 'errors');
        end;
    end;
  finally
    //dispose
  end;
函数GetPdfReport( //这是MyEnum的字符串表示形式 收敛参数:Pchar ):t字节;stdcall;出口; 变量 //我的助手 开始 尝试 尝试 //我试图故意传递不正确的字符串值以获取异常 MyEnumVariable:=TRttiEnumerationType.GetValue(AStringParam); //代码隐藏 除了 关于E:Exception-do 开始 //日志错误 Log.Error(E.ClassName+':'+E.Message,'errors'); 结束; 结束; 最后 //处置 结束; 然后我得到一个例外:

InnerException消息为“无效的枚举值”\u 24170“无法删除” 反序列化为类型 “MyEnum”

我希望日志异常消息带有作为参数传递的字符串值,但不需要一些不清楚的数字,如“\u 24170”。我该怎么做

更新:

假设我有
MyEnum
和3个值
(一,二,三)
,当我传递到我的函数字符串
“五”
时,我希望看到这样的异常:

无效的枚举值“5”无法反序列化为类型“MyEnum”


谢谢。

如果提供的文本与某个枚举值不匹配,则您提供的代码不会引发异常。而是返回值
-1
。当然,
-1
不是有效的枚举值,因此如果希望执行错误处理,
trttineumerationtype.GetValue
是一个相当有问题的方法

你需要自己测试一下。与其使用
TRttiEnumerationType
,不如直接转到
GetEnumValue
,这会返回一个整数,从而使错误检查更易于编写

var
  OrdinalValue: Integer;
  Value: MyEnum;
....
OrdinalValue := GetEnumValue(TypeInfo(MyEnum), AStringParam);
if OrdinalValue = -1 then
  // handle error
Value := MyEnum(OrdinalValue);

当然,您希望将其包装到一个方法中以使其可重用。

如果提供的文本与其中一个枚举值不匹配,则您提供的代码不会引发异常。而是返回值
-1
。当然,
-1
不是有效的枚举值,因此如果希望执行错误处理,
trttineumerationtype.GetValue
是一个相当有问题的方法

你需要自己测试一下。与其使用
TRttiEnumerationType
,不如直接转到
GetEnumValue
,这会返回一个整数,从而使错误检查更易于编写

var
  OrdinalValue: Integer;
  Value: MyEnum;
....
OrdinalValue := GetEnumValue(TypeInfo(MyEnum), AStringParam);
if OrdinalValue = -1 then
  // handle error
Value := MyEnum(OrdinalValue);

当然,你会想用一种方法来包装它,使其可重复使用。

@DavidHeffernan,那么,你看,my不包含这个string@DavidHeffernan,看,然后,我的不包含此字符串。我的dll与soap web服务一起工作,似乎在调用web服务方法时引发了异常,无论如何,谢谢你的回答,这对我非常有用。我的dll与soap web服务一起工作,似乎在我调用web服务方法时引发了异常,无论如何,谢谢你的回答,这对我非常有用。