当前位置: 首页 > 知识库问答 >
问题:

Delphi无效的枚举值'_24170'

董小林
2023-03-14

我有我的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消息为“无效枚举值”\u 24170“无法反序列化为类型“MyEnum”。

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

更新:

假设我有一个MyEnum,有三个值(一、二、三),当我传递到函数字符串“五”时,我想看到如下异常:

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

谢谢

共有1个答案

柴宏阔
2023-03-14

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

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

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

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

 类似资料:
  • 我需要java JAVA CODE中此解决方案的delphi解决方案

  • 多次调用特定枚举类的value()函数是否效率低下? 我见过一些现有代码的实例,其中values()的结果被缓存以供重用。这有用吗?

  • 枚举具有名为'hash value'的属性,该属性是枚举内的索引。

  • 问题内容: 我有一个枚举的类对象(我有一个),我需要获取此枚举表示的枚举值的列表。该静态函数有我需要什么,但我不知道怎么去从类对象访问它。 问题答案:

  • 我正在使用LWJGL,当使用Util.checkGLError()检查时,下面的OpenGL调用导致无效的枚举错误 GL11.glTexParameteri(GL11.GL_TEXTURE_2D,GL11.GL_Textture_WRAP_S,GL11.GL_CLAMP); 我已经把范围缩小到GL_CLAMP,因为GL_REPEAT有效。还应该指出的是,GL_CLAMP在我的笔记本电脑上运行良好,

  • 在TypeScript中,我定义了一个,然后我想让一个函数接受一个参数,该参数的值是枚举的值之一。但是,TypeScript似乎不对值进行任何验证,并允许枚举之外的值。有办法做到这一点吗? 如果我使用而不是,我可以得到与我所要得到的类似的东西,但是我失去了enum的一些功能。