GVKun编程网logo

是“ throwable”的良好做法

9

在这篇文章中,我们将为您详细介绍是“throwable”的良好做法的内容。此外,我们还会涉及一些关于-1-6java异常简单介绍java异常异常体系Throwable分类throws和throw异常处

在这篇文章中,我们将为您详细介绍是“ throwable”的良好做法的内容。此外,我们还会涉及一些关于-1-6 java 异常简单介绍 java异常 异常体系 Throwable 分类 throws和throw 异常处理 自定义异常、7.6 Throwable的几个常见方法、Android-Throwable: A WebView method was called on thread ''JavaBridge''.、angularjs – Angular TypeScript:$watchCollection,“controller as”的良好做法的知识,以帮助您更全面地了解这个主题。

本文目录一览:

是“ throwable”的良好做法

是“ throwable”的良好做法

过去,我使用以下方法读取大量代码:

public Object doSomething() throws Throwable {    ...}

这样做是惯例吗?

优点和缺点是什么?

throws Trowable 在我看来,这就像完成异常的“ Agent Orange”方式

编辑


  1. 处理方法中的预期异常

  2. 引发意外异常(一对一)

  3. 不在乎错误

那是路要走吗?

答案1

小编典典

你不应该扔Throwable。这就是为什么。

Throwable是可抛出的事物层次结构的顶部,由Exceptionsand组成Errors。由于Errors根据定义是由不可挽救的条件引起的,因此将它们包括在方法声明中是没有意义的。剩下的只是Exception

您应该throws Exception改为声明您的方法。

注意,范围越窄throws越好。

声明你的方法是throws Exception,那么你的方法不会产生异常,而是调用作为一个声明其他代码throwsException,你想例外渗透调用堆栈。

如果您的方法是 生成 异常,则声明一个较小的范围,例如throws IOException, MyProcessingException,等等

-1-6 java 异常简单介绍 java异常 异常体系 Throwable 分类 throws和throw 异常处理 自定义异常

-1-6 java 异常简单介绍 java异常 异常体系 Throwable 分类 throws和throw 异常处理 自定义异常

 
异常
 
异常:异常就是Java程序在运行过程中出现的错误。
异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象。
其实就是Java对不正常情况进行描述后的对象体现。
Throwable
        |--Error        严重问题,我们不处理。
        |--Exception
                |--RuntimeException        运行期异常,我们需要修正代码
                |--非RuntimeException 编译期异常,必须处理的,否则程序编译不通过
 
 
Exception和Error的子类名都是以父类名作为后缀。
 
Java中的异常被分为两大类:编译时异常和运行时异常。
所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常
编译时异常
•Java程序必须显示处理,否则程序就会发生错误,无法通过编译
运行时异常
•无需显示处理,也可以和编译时异常一样处理
 
 
Throwable基本方法
getMessage()
•获取异常信息,返回字符串。
toString()
•获取异常类名和异常信息,返回字符串。
printStackTrace()
•获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
printStackTrace(PrintStream s)
•通常用该方法将异常内容保存在日志文件中,以便查阅。
 
 
throws和throw
throws
•用在方法声明后面,跟的是异常类名
•可以跟多个异常类名,用逗号隔开
•表示抛出异常,由该方法的调用者来处理
•throws表示出现异常的一种可能性,并不一定会发生这些异常
throw
•用在方法体内,跟的是异常对象名
•只能抛出一个异常对象名
•表示抛出异常,由方法体内的语句处理
•throw则是抛出了异常,执行throw则一定抛出了某种异常 
 
异常处理过程
 
JVM的默认处理
        把异常的名称,原因,位置等信息输出在控制台,但是程序不能继续执行了。
自己处理
        try...catch...finally
                自己编写处理代码,后面的程序可以继续执行
        throws
                把自己处理不了的,在方法上声明,告诉调用者,这里有问题
 

try

{

 

需要检测的代码;

}

catch

(异常类  变量)

{

 

异常处理代码;

}

finally

{

 

一定会执行的代码; 

}

Finally代码块控制的语句体一定会执行

只有一种情况不会被执行。就是在之前执行了System.exit(0)

主要用于释放资源

 
常见变形形式
                        try...catch...finally
                        try...catch...
                        try...catch...catch...
                        try...catch...catch...fianlly
                        try...finally
 
 
 
自定义异常
自定义类继承Exception或者其子类,只需要提供无参构造和一个带参构造即可
通过构造函数定义异常信息。

例:

Class DemoException extends Exception

{

  DemoException(String message)

  {

  super(message);

  }

}

 

通过throw将自定义异常抛出。
 
RuntimeException以及其子类如果在函数中被throw抛出,可以不用在函数上声明。
1.父的方法有异常抛出,子的重写方法在抛出异常的时候必须要小于等于父的异常,也就是必须抛出相同的异常或异常的子类
2.父的方法没有异常抛出,子的重写方法不能有异常抛出,如果子类方法内有异常发生,那么子类只能try,不能throws
3.父的方法抛出多个异常,子的重写方法必须比父少或者小,不能抛出新的异常
 

7.6 Throwable的几个常见方法

7.6 Throwable的几个常见方法

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
 * 在try里面发现问题后,jvm会帮我们生成一个异常对象,然后把这个对象抛出,和catch里面的类进行匹配。
 * 如果该对象是某个类型的,就会执行该catch里面的处理信息。
 * 
 * 异常中要了解的几个方法:
 * public String getMessage():异常的消息字符串  
 * public String toString():返回异常的简单信息描述
 *   此对象的类的 name(全路径名)
 *   ": "(冒号和一个空格) 
 *   调用此对象 getLocalizedMessage()方法的结果 (默认返回的是getMessage()的内容)
 * printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。把信息输出在控制台。
 */
public class ExceptionDemo {
 public static void main(String[] args) {
  String s = "2014-11-20";
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  try {
   Date d = sdf.parse(s); // 创建了一个ParseException对象,然后抛出去,和catch里面进行匹配
   System.out.println(d);
  } catch (ParseException e) { // ParseException e = new ParseException();
   // ParseException
   // e.printStackTrace();
   // getMessage()
   // System.out.println(e.getMessage());
   // Unparseable date: "2014-11-20"
   // toString()
   // System.out.println(e.toString());
   // java.text.ParseException: Unparseable date: "2014-11-20"
   
   e.printStackTrace();
   //跳转到某个指定的页面(index.html)
  }
  System.out.println("over");
 }
}

Android-Throwable: A WebView method was called on thread ''JavaBridge''.

Android-Throwable: A WebView method was called on thread ''JavaBridge''.

错误详情:

01-30 03:36:52.441 12000-12048/cn.h5 D/@@@: e.ttt:java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread ''JavaBridge''. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1) {18b9c7c8} called on Looper (JavaBridge, tid 481) {789820c}, FYI main Looper is Looper (main, tid 1) {18b9c7c8})

 

 

当出现以上错误后,处于阻塞状态,无任何效果,出现此错误的原因是:

webView.loadUrl("javascript:show(" + json + ")");

 

解决方法:

runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                       
                        webView.loadUrl("javascript:show(" + json + ")");
                    }
                });

 

angularjs – Angular TypeScript:$watchCollection,“controller as”的良好做法

angularjs – Angular TypeScript:$watchCollection,“controller as”的良好做法

一般来说,在我的Angular / TypeScript应用程序中,我倾向于使用“控制器为”语法.

然而,对于我正在研究的CRUD屏幕,我发现自己偏离了这一点.因此我可以利用$watchCollection /检查更改等我发现自己使用了优秀的章节@baSarat here所建议的模式.即,在视频中(在Angular中以“控制器为”语法之前)@ baSarat在名为vm的$scope上创建一个表示控制器的变量.与在视图中使用“controller as vm”的方式相同,您仍然可以使用vm.myProperty / vm.myFunction()样式语法与模型进行交互.

所以,控制器看起来像这样:

module controllers {

    "use strict";

    interface sageEditRouteParams extends ng.route.IRouteParamsService {
        id: number;
    }

    interface sageEditScope extends ng.IScope {
        vm: SageEdit;
    }

    class SageEdit {

        log: loggerFunction;
        sage: sage;
        title: string;

        private _hasChanges: boolean;

        static $inject = ["$routeParams","$scope","common","datacontext"];
        constructor(
            private $routeParams: sageEditRouteParams,private $scope: sageEditScope,private common: common,private datacontext: datacontext
            ) {

            this.sage = undefined;
            this.title = "Sage Edit";

            this.log = common.logger.getLogFn(controllerId);

            $scope.vm = this;
            $scope.$watchCollection("vm.sage",(newSage: sage,oldSage: sage) => {
                if (newSage && oldSage) {
                    this._hasChanges = true;
                }
            });

            this.activate();
        }

        // Prototype methods

        activate() {
            var id = this.$routeParams.id;
            var dataPromises: ng.IPromise<any>[] = [this.getSage(id)];

            this.common.activateController(dataPromises,controllerId)
                .then(() => {
                    this.log("Activated Sage Edit View");
                    this.title = "Sage Edit: " + this.sage.name;
                });
        }

        getSage(id: number) {
            return this.datacontext.sage.getById(id).then(data => {
                this.sage = data;
                this._hasChanges = false;
            });
        }

        get hasChanges(): boolean {
            return this._hasChanges;
        }
    }

    var controllerId = "sageEdit";
    angular.module("app").controller(controllerId,SageEdit);
}

这样的观点:

<sectionng-controller="sageEdit">
    <section>
        <div>
            <div>
                <buttonng-click="vm.cancel()"
                        ng-disabled="!vm.canSave">
                    <i></i>Cancel
                </button>
                <buttonng-click="vm.save()"
                        ng-disabled="!vm.canSave">
                    <i></i>Save
                </button>
                <span ng-show="vm.hasChanges"https://www.jb51.cc/tag/dis/" target="_blank">dissolve-animation ng-hide">
                    <i></i>
                </span>
            </div>
            <div>
                <div data-cc-widget-header title="{{vm.title}}"></div>
                <div>
                    <div>
                        <label>Name</label>
                        <inputng-model="vm.sage.name" />
                    </div>
                    <div>
                        <label>Username</label>
                        <inputng-model="vm.sage.userName" />
                    </div>
                    <div>
                        <label>Email</label>
                        <inputtype="email"
                               ng-model="vm.sage.email" />
                    </div>
                </div>
            </div>
        </div>
    </section>
</section>

我把它放在一起似乎工作得很好,但我想把它放在那里并得到一些其他观点.在那儿:

>这种方法有任何缺点
>任何原因这都是个坏主意
>更好的选择?

我做了一点挖掘,但没有找到任何结论.

解决方法

魔术弦去除

对于

$scope.$watchCollection("vm.sage",oldSage: sage) => {

您还可以轻松实现重构:

$scope.$watchCollection(()=>this.sage,oldSage: sage) => {

在某些情况下,当您尝试观看foo.bar之类的内容时,foo仍未定义,您可以使用安全包装函数safeWatch(()=> this.foo.bar):

function safeWatch<T extends Function>(expression: T) {
        return () => {
            try {
                return expression();
            }
            catch (e) {
                return null;
            }
        };
    }

控制器与$scope.vm

Fron源代码:
https://github.com/angular/angular.js/blob/36831eccd1da37c089f2141a2c073a6db69f3e1d/src/ng/controller.js#L95

这正是角度为你做的事情. ie $scope.vm = instance(其中vm == indentifier)所以它们是等价的

关于是“ throwable”的良好做法的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于-1-6 java 异常简单介绍 java异常 异常体系 Throwable 分类 throws和throw 异常处理 自定义异常、7.6 Throwable的几个常见方法、Android-Throwable: A WebView method was called on thread ''JavaBridge''.、angularjs – Angular TypeScript:$watchCollection,“controller as”的良好做法等相关知识的信息别忘了在本站进行查找喔。

本文标签: