【问题标题】:Finding out where TypeErrors are thrown找出抛出 TypeErrors 的位置
【发布时间】:2011-10-22 23:51:09
【问题描述】:

我遇到了一个让我发疯的问题。 最近,出于性能原因,我将 BlazeDS 配置为使用 Array 而不是 ArrayCollection。此外,我调整了模板以生成 Array 属性。

一切都不顺利。除了导致 TypeError 的一个函数之外的所有函数:错误 #1034。这些在调用结果回调之前被抛出。它声称在将 ArrayCollection 转换为 Array 时遇到问题。我删除了生成的类型以使 Flex 改为使用对象,但这些类型不包含任何 ArrayCollections。我现在的问题是:如何获取事件处理程序中抛出的错误的堆栈跟踪?

我已经在我的所有模块中添加了 unhandledExceptions 处理程序,如果用户交互触发的代码中发生错误,它们会被调用,但它们似乎无法捕获事件处理程序抛出的东西。

如何跟踪这些错误?

克里斯

PS:课程如下: 包 de.upw.ps.ucg.model.ucg.scheduler {

[Bindable]
[RemoteClass(alias="de.upw.ps.ucg.model.ucg.scheduler.Task")]
public class Task extends TaskBase {
}
}

还有:

package de.upw.ps.ucg.model.ucg.scheduler {

import de.upw.ps.ucg.model.oval.common.OvalVersionedIdentifier;
import flash.utils.IExternalizable;

[Bindable]
public class TaskBase {

public function TaskBase() {}


    private var _aborted:Boolean;
    private var _characteristicsId:String;
    private var _currentExecutorPhase:JobExecutorPhase;
    private var _definitionSetName:String;
    private var _definitionSetVid:OvalVersionedIdentifier;
    private var _endTime:Date;
    private var _enqueueTime:Date;
    private var _environmentId:String;
    private var _environmentName:String;
    private var _messages:Array;
    private var _numberOfDefinitions:int;
    private var _processedNumberOfTests:int;
    private var _resultsId:String;
    private var _schedulerJob:SchedulerJob;
    private var _startTime:Date;
    private var _statusMessage:String;
    private var _taskId:String;
    private var _totalNumberOfTests:int;

    public function set aborted(value:Boolean):void {
        _aborted = value;
    }
    public function get aborted():Boolean {
        return _aborted;
    }

    public function set characteristicsId(value:String):void {
        _characteristicsId = value;
    }
    public function get characteristicsId():String {
        return _characteristicsId;
    }

    public function set currentExecutorPhase(value:JobExecutorPhase):void {
        _currentExecutorPhase = value;
    }
    public function get currentExecutorPhase():JobExecutorPhase {
        return _currentExecutorPhase;
    }

    public function set definitionSetName(value:String):void {
        _definitionSetName = value;
    }
    public function get definitionSetName():String {
        return _definitionSetName;
    }

    public function set definitionSetVid(value:OvalVersionedIdentifier):void {
        _definitionSetVid = value;
    }
    public function get definitionSetVid():OvalVersionedIdentifier {
        return _definitionSetVid;
    }

    public function set endTime(value:Date):void {
        _endTime = value;
    }
    public function get endTime():Date {
        return _endTime;
    }

    public function set enqueueTime(value:Date):void {
        _enqueueTime = value;
    }
    public function get enqueueTime():Date {
        return _enqueueTime;
    }

    public function set environmentId(value:String):void {
        _environmentId = value;
    }
    public function get environmentId():String {
        return _environmentId;
    }

    public function set environmentName(value:String):void {
        _environmentName = value;
    }
    public function get environmentName():String {
        return _environmentName;
    }

    public function set messages(value:Array):void {
        _messages = value;
    }
    public function get messages():Array {
        return _messages;
    }

    public function set numberOfDefinitions(value:int):void {
        _numberOfDefinitions = value;
    }
    public function get numberOfDefinitions():int {
        return _numberOfDefinitions;
    }

    public function set processedNumberOfTests(value:int):void {
        _processedNumberOfTests = value;
    }
    public function get processedNumberOfTests():int {
        return _processedNumberOfTests;
    }

    public function set resultsId(value:String):void {
        _resultsId = value;
    }
    public function get resultsId():String {
        return _resultsId;
    }

    public function set schedulerJob(value:SchedulerJob):void {
        _schedulerJob = value;
    }
    public function get schedulerJob():SchedulerJob {
        return _schedulerJob;
    }

    public function set startTime(value:Date):void {
        _startTime = value;
    }
    public function get startTime():Date {
        return _startTime;
    }

    public function set statusMessage(value:String):void {
        _statusMessage = value;
    }
    public function get statusMessage():String {
        return _statusMessage;
    }

    public function set taskId(value:String):void {
        _taskId = value;
    }
    public function get taskId():String {
        return _taskId;
    }

    public function set totalNumberOfTests(value:int):void {
        _totalNumberOfTests = value;
    }
    public function get totalNumberOfTests():int {
        return _totalNumberOfTests;
    }
}
}

这两个类都是由我的 maven 构建从相应的 Java 类生成的,并且类型确实很好地结合在一起。

【问题讨论】:

  • 不确定我是否理解。你刚才说他们在抛出错误......
  • 问题是我在执行第一个回调之前得到了这些错误,所以我想这与从服务器发回的数据的反序列化问题有关。我检查过,响应不包含 ArrayCollection(因此不应该抛出这样的错误)。我的问题是调试器通常会在这种情况下挂起,我可以看到问题出在哪里。在这种情况下,它不会挂起,并且会在没有堆栈跟踪的情况下输出简单的跟踪消息。因此我不知道哪里出了问题。
  • 你说得对,应该是反序列化的时候。您是否有任何将 as3 类与 java DTO 相关联的 RemoteClass 元数据?您应该尝试显示更多代码。
  • 我添加了我正在使用的类。作为补充......即使我使用默认的“对象”类进行反序列化,我实际上也遇到了这些错误(这真的很诡异)......所以我真正的问题是:我怎样才能看到出了什么问题,尤其是在哪里.
  • 你确定错误甚至在反序列化中?也许它会在之后发生。

标签: apache-flex actionscript amf typeerror


【解决方案1】:

您是否有权访问正在读取所有这些消息的套接字类?在反序列化之前跟踪缓冲区,您至少应该能够找到给您带来麻烦的类。

如果做不到这一点,在反序列化后追踪对象,它应该是抛出错误后的第一个对象。

【讨论】:

  • 我会这样做,但不幸的是,我只是使用普通的 RemotObject 使用 AMF 与我的 BlazeDS 服务器进行通信。我不知道如何为此在 Socket 类中设置断点。
  • 我只是试图调试响应的读取......不幸的是 MessageResponder.result(message) 是调试器堆栈的底部,这里的消息已经解析......我不知道如何调试更高级别。更深入地研究代码,Socket 可能是 flash.net.NetConnection 类型的对象,但我无法查看任何代码,因为这似乎是原生 Flash Player 类。
  • 我也在使用 Socket 类。我将readBytes() 调用为ByteArray,然后在ByteAray 上调用readObject() 以获取对象。当它调用readObject() 时,就会发生反序列化。你能先进去看看ByteArray吗?它会给你对象。
  • 您也可以尝试扩展Socket 类,覆盖readBytes() 方法以在调用super.readBytes() 之前跟踪即将到来的内容。代替香草的使用Socket
  • 如原始问题中所述。我想要一种方法来简单地获取错误来源的堆栈跟踪。结果是 100% 正确解析的,对象是 100% 应有的方式......我完全不知道 TypeError 的来源。您的建议将使我不得不重新实现 flex 框架的许多类。
【解决方案2】:

这是你必须自己调试的东西,但我有一种直觉,问题是因为你的 java DTO 发送的数据与你的 AS3 类不同,即使你有RemoteClass 元数据说它是。

您是否缺少财产?还是属性不匹配?这是您错误的最可能原因。我建议你尽可能多地调试 java 端,并使用 firebug 之类的东西来查看服务器的请求/响应。

【讨论】:

  • 这些是我检查的第一件事。属性正确,所有属性都正确填写。即使结果不包含任何内容,我仍然会收到 TypeError(请记住,我说过,即使没有使用专用类并使用“Object”类返回 Flex 的反序列化,我也会收到这些错误)。我不是在寻找反序列化中的问题,而是在寻找一种调试此类错误的方法,因为似乎无法查看它们的来源。
猜你喜欢
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多