Статьи

Подсказка: выбрасывать ошибки чистым способом

При разработке, особенно при разработке для других разработчиков, наступает время, когда вы думаете: «Я действительно должен предвидеть эту ошибку». Этот быстрый совет покажет вам, как это сделать — чистый способ.


Часто вы пытаетесь предвидеть ошибку, но в итоге просто отследите что-то. Во время отладки было бы очень полезно сгенерировать исключение, чтобы ваш код прекратил выполнение, или дать дополнительную информацию о причинах возникновения ошибки. Для этого вам нужно выдать ошибку пользователю, то есть проигрыватель отладки Flash сможет ее перехватить, как и консоль при экспорте непосредственно из Flash Professional.

Допустим, я создаю класс User; это статический класс с параметрами, такими как name и gender .

Теперь предположим, что я хочу поймать, вводит ли пользователь что-то кроме M или F в его / ее поле:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package {
 
    public class User1 {
        private static var _name:String;
        private static var _gender : String;
         
        //SETTERS
        public static function set name(name:String):void{
            _name = name;
        }
        public static function set gender(gender:String):void{
            gender = gender.toUpperCase();
            if(gender != «F» && gender !=»M»){
                throw new Error(«Gender must be F or M»);
            }else{
                _gender = gender;
            }
        }
        public static function get name():String{
            return _name;
        }
        public static function get gender():String{
            return _gender;
        }
    }
}

Отправляя что-то вроде User1.gender = "multi" , я бы User1.gender = "multi" ошибку в моем отладчике, указав, что мой пол неверен.


Захватив эту концепцию и развивая ее, я также могу создавать собственные классы ошибок.

Допустим, у меня есть класс UConnection, который обрабатывает действия подключения пользователя, такие как вход в систему. Эта функция входа в систему отправляет информацию в метод php, который возвращает идентификатор пользователя (в этом случае я назову его uid), и вам нужно ожидать, что идентификатор uid будет недействительным (то есть вход в систему не может быть выполнен).

Сначала вам нужно создать собственный класс ошибок, класс UIDError.

1
2
3
4
5
6
7
package{
    public class UIDError extends Error{
        public function UIDError():void{
            super(«User ID returned invalid»);
        }
    }
}

Во-вторых, класс, который ожидает и обрабатывает исключение:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
package{
     
    public class User{
            private static var _uid:int;
         
        //SETTER
        public static function set uid(uid:int):void{
            if(uid == 0){
                throw new UIDError();
            }else{
                _uid = uid;
            }
        }
         
        //GETTER
        public static function get uid():int{
            return _uid;
        }
    }
}

Наконец, реализация:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
//bear in mind this is pseudo code,
//it will not work as I don’t have a login.php
//and I’m not sending any variable through post,
//for a working version refer to the samples provided
 
public function login(un:String;pw:String):void{
    urlloader:URLLoader = new URLLoader();
    urlloader.addEventListener(Event.COMPLETE,onLogin)
    urlloader.load(new URLRequest(«login.php»));
}
 
private function onLogin(e:Event){
    try{
        User.uid = e.target.data
    }catch(e:UIDError){
        trace(«login invalid»);
    }
}

Код внутри блока catch запускается, если он замечает какие-либо ошибки, возникающие внутри блока try . В этом случае, если при попытке установить User.uid , будет отслеживаться "login invalid" . Если возникнет ошибка другого типа, Flash Player будет реагировать так, как обычно.


Итак, у вас есть чистый, простой способ обработки ошибок в вашем коде для удовольствия отладки для вас и ваших коллег.

Надеюсь, вам понравился этот быстрый совет, спасибо за чтение!