语言javascript 之死处理try catch finally–05

将手机当活动鼠标、键盘使用非常便利,本文将促成这等同效益。该使用分为两局部:Windows服务端和Android客户端。

语法结构

try catch finally是ECMAScript-262
第三本供充分处理体制的正儿八经,语法结构如下:

1 try{
2 //可能会发生的错误代码
3 }
4 catch(error){
5 //错误处理
6 }finally{
7  //无论是否有异常都会执行
8 }

语法与多数言语一样 如java
.net,如果try{}代码块捕获到了非常,那么catch块会得到一个错误信息对象(Error
的实例)。

俺们应有将发生或出错误的代码放在try块中,而错误处理在catch块中;在js中一旦<script></script>代码块被来了错误还尚未进行捕获异常处理,那么当前<script>代码块后续的代码是休见面履之
,但是未会见潜移默化及其它<script></script>代码块代码如:

 1 <script>
 2   function run(){
 3       console.log(age);
 4   }
 5     run();
 6     console.log('可以输出吗?');//没有执行
 7 </script>
 8 
 9 <script>
10     console.log('这是第二个代码块');//执行了,这是第二个代码块
11 </script>

倒之后续的代码还是会实施 如:

 1 <script>
 2   function run(){
 3       try{
 4           console.log(age);
 5       }catch(error){
 6 
 7       }
 8 
 9   }
10     run();
11     console.log('可以输出吗?');//可以输出吗?
12 </script>
13 
14 <script>
15     console.log('这是第二个代码块');//这是第二个代码块
16 </script>

本文源代码的下载地址:http://download.csdn.net/detail/k_c_u_f/6673245。

finally语句

倘在finally代码块,那么不论什么原因里的代码都见面履行,甚至是catch
语句被发出return语句 如下代码:

    function say() {
        try {
            console.log(age)
            return;
        } catch (erroe) {
            console.log(erroe.message);//age is not defined
            return;
        } finally {
           console.log('finally 执行了');//finally 执行了
        }
    }
    say();

认识Error 类型

当代码运行时起错误,会创一个Error对象,并将该抛弃来,这个目标涵盖了错的叙说信息。

如在 try…catch(error){…} 语句中Error
是Error类型抛出的对象,该对象有三单着力的性能name 错误名称,message
错误信息,stack 错误栈信息;

推行代码期间可能会见发生的左产生多种类型,所以Error 又派生了几只男 如:

Error                                  Error
类型的谬误非常少见,如果产生否是浏览器抛来底;这个基类型的要紧目的是供开发人员抛来由定义错误。
EvalError                          
创建一个error实例,表示错误的故:与 eval() 有关。
InternalError                    
 创建一个意味Javascript引擎内部错误的大抛来底实例。 如: “递归太多”.
RangeError                      
创建一个error实例,表示错误的由来:数值变量或参数超出其行限制。
ReferenceError                
创建一个error实例,表示错误的原因:无效引用。
SyntaxError                      
创建一个error实例,表示错误的原故:eval()在条分缕析代码的长河遭到起的语法错误。
TypeError                        
创建一个error实例,表示错误的因由:变量或参数不属中类型。
URIError            创建一个error实例,表示错误的来头:给
encodeURI()或 decodeURl()传递的参数无效。

Error
是基类,其他左类型且是延续自Error类型,所以子类也尽管有着了三个为主的性name
错误名称,message 错误信息,stack 错误栈信息。

发出了这些错误类型我们虽可以描绘类似这样的代码,通过判断好的种来特定处理某平等接近的雅
如:

 1 <script>
 2     function run() {
 3         try {
 4             say("hello word");
 5         }
 6         catch (error) {
 7             for (var p in error) {
 8                 document.writeln(error[p]);
 9             }
10             //上面可以遍历错误
11             if (error instanceof EvalError) {
12                 //如果非法调用了eval()函数,则会抛出EvalError的异常。
13                 alert("EvalError");
14             } else if (error instanceof ReferenceError) {
15                 //错误的引用,此例子是执行到了本步。
16                 alert("ReferenceError");
17             } else if (error instanceof RangeError) {
18                 //数值超出了范围
19                 alert("RangeError");
20             } else if (error instanceof SyntaxError) {
21                 //语法错误,错误发生在eval(),
22                 alert("SyntaxError");
23             } else if (error instanceof TypeError) {
24                 //变量类型不是预期的
25                 alert("TypeError");
26             } else if (error instanceof URIError) {
27                 //错误发生在encodeURI()或decodeURI()中
28                 alert("URIError");
29             }
30         }
31     }
32     run();
33 </script>

语言 1

 

Windows服务端的工目录如下:

throw抛来由定义错误类型

语法:throw exception;

exception 可以是另类型的多寡 如:

throw 12345;

throw ‘hello’;

throw true;

throw {name:’Joel’,age:20};

应用throw语句来废弃来一个自定义异常 如:

 1 <script>
 2     function see(){
 3         try {
 4             if(true){
 5                 throw new Error("my eroor!");
 6             }
 7 
 8         } catch (error) {
 9             console.log(error.name );//Error
10             console.log(error.message);//my eroor!
11             console.log(error.stack);//Error: my eroor! at see (try.html:12) at try.html:22
12         }
13     }
14     see();
15 </script>

语言 2

Javascript的不可开交处理机制

当行之javascript代码中起错误的时候,js引擎就见面依据js的调用栈逐级寻找对应之catch,如果无找到呼应的catch
handler或者本身还要有error或者同时抛出新的error,最后就会见管这error的处理交给浏览器,浏览器会就此各自不同的章程(IE以黄色三角图案展示在左下角,而firefix会显示在左决定台中)显示错误信息给用户;

fMain是服务端的主界面,tListen是劳务端的监听线程,tReceive是劳动端的接受线程。

window.onerror

另外没有经tyr-catch处理的不当还见面触发window对象的error事件 如:

 1 <script>
 2     window.onerror= function (msg,url,l)
 3     {
 4         console.log(msg)//Uncaught ReferenceError: a is not defined
 5         console.log(url)//http://localhost:63342/person_Project/js_demo/onerror.html
 6         console.log(l)//17
 7     }
 8 
 9     function run(){
10         console.log(a)
11     }
12     run()
13 </script>

window.onerror 事件接受三个参数:msg  错误信息、url  发生错误的页面的
url 、line 发生误的代码行。

Android客户端的工程目录如下:

前者代码异常监控方案

有矣try catch 捕获的失实对象加上window.onerror
全局监听错误事件,那么前端js代码错误监控变的极致简单了。

 

语言 3

MainActivity是客户端的主Activity,ConnectThread是客户端的连续线程,SendThread是客户端的殡葬线程。

Java语言的通信发生Socket(套接字)和HTTP两栽艺术,其中Socket(套接字)又分为TCP和UDP。TCP是面向连接的、可靠的通信方式,UDP是不管连接的通信方式。

TCP通信方式的服务端采用ServerSocket进行监听,客户端采用Socket发出连要。当ServerSocket收到连接要时,调用accept()方法返回一个Socket和客户端的Socket建立连接并通信。

正文采用TCP实现了Android移动设备及Windows计算机的连,计算机作为劳动器端监听,移动设备作为客户端,向电脑来连要。

Windows端监听线程tListen.java的代码如下:

import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;


public class tListen extends Thread{

    public static ServerSocket ssct_server;
    public static Socket sct_server;
    public static InetAddress ip_server;
    public static Integer pt_server;

    // 线程变量
    public static tReceive t_receive;

    // 本机IP和PORT
    public tListen(InetAddress ip, int port){

        this.ip_server = ip;
        this.pt_server = port;

    }

    public void run(){
        // 开始监听
        try
        {
            fMain.l_status.setText("状态:正在监听客户端......");
            ssct_server = new ServerSocket(pt_server,2,ip_server);
            sct_server = ssct_server.accept();
            fMain.l_status.setText("状态:已经连接上客户端!");
            fMain.set_btn(0, 1);
            // 启动接收线程
            t_receive = new tReceive(sct_server); 
            t_receive.start();
        }
        catch (Exception e0)
        {
            fMain.l_status.setText("错误:" + e0);
            if (ssct_server != null)
                try
                {
                    ssct_server.close();
                }
                catch (Exception e1)
                {
                    fMain.l_status.setText("错误:" + e1);
                }
        }       
    }

}

ssct_server = new

ServerSocket(pt_server,2,ip_server)监听ip_server地址的pt_server端口,当接过客户端的总是要时,sct_server

ssct_server.accept()接受连接要,并回一个socket和客户端通信。

Android端连接线程ConnectThread.java的代码如下:

package com.hzhi.mouse_mb;

import java.net.Socket;

import android.os.Bundle;
import android.os.Message;
import android.widget.Toast;

public class ConnectThread extends Thread{

    public static Socket socket_client;
    public static String ip_server;
    public static int port_server;

    // 消息变量
    private Message msg;
    private Bundle bdl;

    public ConnectThread(String ip, int pt){

        this.ip_server = ip;
        this.port_server = pt;

    }

    public void run(){

        try
        {
            socket_client = new Socket(ip_server, port_server);
            send_message(MainActivity.msg_con_stop, "");            
        }
        catch(Exception e)
        {
             send_message(MainActivity.msg_error, e.getMessage());
        }

    }

    // 发送消息(用于更新UI)
    public void send_message(int x, String s){

        msg = new Message();
        bdl = new Bundle(); 
        bdl.putString("1",s);
        msg.what = x;
        msg.setData(bdl);   
        MainActivity.main_handler.sendMessage(msg);

    }

}

socket_client = new Socket(ip_server,
port_server)向地方为ip_server、端口为port_server的服务器发连要,如连续成功,使用socket_client和服务器的Socket进行通信。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图