【问题标题】:delphi Invalid enum value '_24170'delphi无效的枚举值'_24170'
【发布时间】:2017-11-03 07:33:41
【问题描述】:

我有我的 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;

然后我得到异常:

InnerException 消息是“无效的枚举值 '_24170”,不能 反序列化为类型 '我的枚举'。

我想要记录异常消息,其中包含我作为参数传递的字符串值,但不是一些不清楚的数字,例如“_24170”。我该怎么做?

更新:

假设我有 MyEnum 和 3 个值 (One, Two, Three),当我传递给我的函数字符串 "Five" 时,我希望看到这样的异常:

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

谢谢。

【问题讨论】:

标签: delphi enums


【解决方案1】:

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

您需要自己对此进行测试。与使用 TRttiEnumerationType 相比,直接转到 GetEnumValue 可能更简单,它返回一个整数,因此编写错误检查更简单。

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

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

【讨论】:

  • 我的 dll 与肥皂网络服务一起工作,当我调用网络服务方法时似乎引发了异常,无论如何感谢您的回答,这对我非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 2011-04-08
相关资源
最近更新 更多