文件流的错误处理程序 - AS3 AIR
Error hanlder for FileStream - AS3 AIR
我正在使用 FileStream
将对象保存到文件中。我正在保存的对象中有变量:
var saveObj:Object = new Object()
saveObj['FirstName']="Georges"
saveObj['LastName']="St-Pierre"
我的问题是:如何为加载文件时丢失的变量创建错误处理程序?例如缺少 'Firstname'。我怎么做?这是我的代码,但它不起作用。
private function F_loadData():void {
folder = File.documentsDirectory.resolvePath("saved projects");
var file:File = folder.resolvePath("mySave.adktf");
var stream:FileStream = new FileStream();
stream.addEventListener(Event.COMPLETE, completeHandler);
stream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
stream.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
stream.openAsync(file, FileMode.READ);
var myLoadedObj:Object = stream.readObject();
stream.close()
trace(myLoadedObj.MiddleName)
}
private function completeHandler(event:Event):void {
trace("load Complete")//not final. Just for testing
}
private function progressHandler(event:ProgressEvent):void {
// ...
}
//I was hoping the error would call this function
private function errorHandler(event:IOErrorEvent):void {
trace("Error found")//not final. Just for testing
}
trace(myLoadedObj.MiddleName) 应该 return 一个错误,我希望它会调用我创建的错误处理函数,但它没有。它仍然 return 是一个错误。那么我应该如何以及使用什么类型的错误处理程序呢?
由于您是异步打开文件,因此需要等到 readObject
完成事件后才能使用。
您定义的错误处理程序仅适用于文件加载。因此,如果打开文件时出现问题,将调用错误处理程序,任何其他类型的错误都在该范围之外。
尝试这样的事情:
private var stream:FileStream;
private function F_loadData():void {
folder = File.documentsDirectory.resolvePath("saved projects");
var file:File = folder.resolvePath("mySave.adktf");
if(file.exists){
stream = new FileStream();
stream.addEventListener(Event.COMPLETE, completeHandler);
stream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
stream.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
stream.openAsync(file, FileMode.READ);
//now wait for it to load
}else{
//file doesn't exist, do something
}
}
private function completeHandler(e:Event):void {
trace("load Complete")//not final. Just for testing
var myLoadedObj:Object = stream.readObject();
stream.close();
stream = null;
if(!myLoadedObj.MiddleName || myLoadedObj.MiddleName == ""){
//Middle name is missing or empty, do something
}
if(!myLoadedObj.FirstName || myLoadedObj.FirstName == ""){
//First name is missing or empty, do something
}
}
您可能更适合为您的保存对象使用自定义 class,如下所示:
package {
public class SaveObject {
public var middleName:String;
public var lastName:String;
//any other properties
public function validate():Boolean {
//write some validation
//if you want lazy validation, you could do this: (untested)
for (var i in obj){
if(obj[i] is String && (obj[i] == null || obj[i] == "")){
return false;
}
}
return true;
}
}
}
然后,您可以这样做:(在您的构造函数中)
flash.net.registerClassAlias("SaveData",SaveData);
那么您可以进行以下操作:
var mySaveData:SaveData = new SaveData();
//set properties
stream.writeObject(mySaveData);
//then later
var mySaveData:SaveData = stream.readObject();
if(!mySaveData.validate()){
//do something, it's invalid
}
我正在使用 FileStream
将对象保存到文件中。我正在保存的对象中有变量:
var saveObj:Object = new Object()
saveObj['FirstName']="Georges"
saveObj['LastName']="St-Pierre"
我的问题是:如何为加载文件时丢失的变量创建错误处理程序?例如缺少 'Firstname'。我怎么做?这是我的代码,但它不起作用。
private function F_loadData():void {
folder = File.documentsDirectory.resolvePath("saved projects");
var file:File = folder.resolvePath("mySave.adktf");
var stream:FileStream = new FileStream();
stream.addEventListener(Event.COMPLETE, completeHandler);
stream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
stream.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
stream.openAsync(file, FileMode.READ);
var myLoadedObj:Object = stream.readObject();
stream.close()
trace(myLoadedObj.MiddleName)
}
private function completeHandler(event:Event):void {
trace("load Complete")//not final. Just for testing
}
private function progressHandler(event:ProgressEvent):void {
// ...
}
//I was hoping the error would call this function
private function errorHandler(event:IOErrorEvent):void {
trace("Error found")//not final. Just for testing
}
trace(myLoadedObj.MiddleName) 应该 return 一个错误,我希望它会调用我创建的错误处理函数,但它没有。它仍然 return 是一个错误。那么我应该如何以及使用什么类型的错误处理程序呢?
由于您是异步打开文件,因此需要等到 readObject
完成事件后才能使用。
您定义的错误处理程序仅适用于文件加载。因此,如果打开文件时出现问题,将调用错误处理程序,任何其他类型的错误都在该范围之外。
尝试这样的事情:
private var stream:FileStream;
private function F_loadData():void {
folder = File.documentsDirectory.resolvePath("saved projects");
var file:File = folder.resolvePath("mySave.adktf");
if(file.exists){
stream = new FileStream();
stream.addEventListener(Event.COMPLETE, completeHandler);
stream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
stream.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
stream.openAsync(file, FileMode.READ);
//now wait for it to load
}else{
//file doesn't exist, do something
}
}
private function completeHandler(e:Event):void {
trace("load Complete")//not final. Just for testing
var myLoadedObj:Object = stream.readObject();
stream.close();
stream = null;
if(!myLoadedObj.MiddleName || myLoadedObj.MiddleName == ""){
//Middle name is missing or empty, do something
}
if(!myLoadedObj.FirstName || myLoadedObj.FirstName == ""){
//First name is missing or empty, do something
}
}
您可能更适合为您的保存对象使用自定义 class,如下所示:
package {
public class SaveObject {
public var middleName:String;
public var lastName:String;
//any other properties
public function validate():Boolean {
//write some validation
//if you want lazy validation, you could do this: (untested)
for (var i in obj){
if(obj[i] is String && (obj[i] == null || obj[i] == "")){
return false;
}
}
return true;
}
}
}
然后,您可以这样做:(在您的构造函数中)
flash.net.registerClassAlias("SaveData",SaveData);
那么您可以进行以下操作:
var mySaveData:SaveData = new SaveData();
//set properties
stream.writeObject(mySaveData);
//then later
var mySaveData:SaveData = stream.readObject();
if(!mySaveData.validate()){
//do something, it's invalid
}