JavaScript高級プログラム設計:学習ノート10--エラー処理とJSON


1.エラー処理とデバッグ
1.エラー処理
1.try-catch-finally文
    catch文には一つのパラメータが必要です.finallyは選択できますが、finallyは必ずfinally文を実行します.try/catch文にはreturn文があります.
2.7種類のエラータイプ
Error:ベースタイプは、他のエラータイプはこのタイプから引き継がれます.通常は開発者がカスタムエラーを投げ出します.EveralErrer:eval()関数を使って異常が発生した時に投げられます.RangeErr:値が該当範囲を超えた時にトリガします.ReferenceErr:存在しない変数にアクセスした時に、この異常を投げます.SyntxErr:文法エラーTyptErr型が保存されます.また、存在しない方法にアクセスすると、このエラーが発生します.URIError:encodeURI()またはdecodeURI()を使用していますが、URIフォーマットが正しくないとURIErrorエラーが発生します.
    私たちはinstance ofオペレータを使ってエラーのタイプを判断できます.
try {
	someFunction();
} catch (error) {
	if (error instanceof TypeError) {
		//
	} else if (error instanceof ReferenceError) {
		//
	} else {
		//
	}
}
2.エラーの投げ方
    throwによってカスタムエラーを出します.エラーの種類を内蔵することによって、実際にブラウザのエラーをシミュレートできます.
throw new Error("Something bad happened");
    プロトタイプチェーンを利用して、Errerを継承してカスタムエラータイプを作成することもできます.この場合、新規作成されたエラータイプのためにnameとメッセージ属性を指定する必要があります.
function CustomError(message) {
	this.name = "CustomError";
	this.message = message;
}
CustomError.prototype = new Error();
throw new CustomError("My message");
    関数に焦点を当て、関数の実行に失敗する可能性がある要因、例えば以下のコードに注目すべきである.
<!DOCTYPE html>
<html>
<head>
    <title>Throwing Errors Example</title>
</head>
<body>
    <script type="text/javascript">
        function process(values){
        
        	//                    
            if (!(values instanceof Array)){
                throw new Error("process(): Argument must be an array.");
            }
        
            values.sort();
        
            for (var i=0, len=values.length; i < len; i++){
                if (values[i] > 100){
                    return values[i];
                }
            }
        
            return -1;
        }

		try {
			process("string");
		} catch(error) {
			alert(error.message);
		}
    
    </script>
</body>
</html>
3.エラーイベント
    try-catchによって処理されていないエラーは、Windowsオブジェクトのerrorイベントをトリガします.すべての私たちは、try-catch文を適切に使用します.
<!DOCTYPE html>
<html>
<head>
    <title>Throwing Errors Example</title>
    <script type="text/javascript" src="./EventUtil.js"></script>
</head>
<body>
    <script type="text/javascript">
		try {
			EventUtil.addHandler(window, "load", function(event) {
				var image = new Image();
				EventUtil.addHandler(image, "load", function(event){
					alert("Image load!");
				});
				
				EventUtil.addHandler(image, "error", function(event){
					alert("Image not loaded!");
				});
				image.src = "notImage.gif";
			});
		} catch(error) {
			alert(error.message);
		}
    
    </script>
</body>
</html>
4.よくあるエラーの種類
    共通の3つのエラー:1.タイプ変換エラー    例えば===!=を選択します.を比較します.2.データの種類が間違っています.    またはif文ではif(str)を使って判断しますが、if(typeof str===string)のようなものを使って比較したり、入ってきたパラメータが文字列であると判断した場合は、関数の先頭にif(typeof str==string)を使います.    基本タイプの値はtypeofで検出されますが、オブジェクトの値はinstance ofで検出されます.3.通信エラー    ajax通信中のエラーのようです.
2.JSON
1.文法
    JSONの文法は以下の3種類の値を表してもいいです.単純値:JavaScriptと同じ文法を使って、JSONに文字列、数値、論理値、nullを表してもいいです.JSONはJavaScriptの特殊値undefinedをサポートしていません.対象:複雑なデータタイプとして、無秩序なキーペアを表しています.各ボタンの値は簡単に対応できます.また、複雑なデータタイプの値であっても良いです.配列:配列も複雑なデータタイプであり、順序正しい値のセットを表すリストであり、数値インデックスによってその中の値にアクセスすることができます.配列の値は任意の種類--単純な値、オブジェクトまたは配列であっても良いです.
1.単純値
    例えば5「ハローワールド」ですが、JSONの文字列はダブルクォーテーションを使用しなければなりません.
2.オブジェクト
    JSONのオブジェクトはJavaScriptのオブジェクトに似ていますが、異なるところがあります.まず、変数を宣言していません.次に、末尾の番号がありません.
{
	"name": "Nicholas",
	"age": 29,
	"school": {
		"name": "Merrimack College",
		"location": "North Andover, MA"
	}
}
3.配列
    JavaScriptと似ていますが、変数とセミコロンもありません.
["hi", 25, true]
2.解析と序列化
1.JSON対象
    JSONオブジェクトには二つの方法があります.strigify()とパーパーパー()は、JavaScriptオブジェクトをJSON文字列に順序付けし、JSON文字列を元のJavaScript値に解析するためにそれぞれ使用されます.
var book = {
			title: "professional JavaScript",
			authors: [
				"Nicholas C. Zakas"
			],
			edition: 3,
			year: 2011
		};
		
		var jsonText = JSON.stringify(book);
		var bookCopy = JSON.parse(jsonText);
2.プログレッシブオプション
    JSON.strigify()はまた、他の2つのパラメータを受信することができます.最初のパラメータはフィルタであり、1つの配列であっても良いし、関数であっても良いです.第二のパラメータはJSON文字列にインデントを保持するかどうかを示すオプションです.
1.フィルタ結果
    フィルタパラメータが配列である場合、JSON.strigify()の結果は配列内の属性のみを含みます.
var book = {
			title: "professional JavaScript",
			authors: [
				"Nicholas C. Zakas"
			],
			edition: 3,
			year: 2011
		};
		
		var jsonText = JSON.stringify(book, ["title", "authors"]);
		document.write(jsonText);
    フィルタパラメータが関数である場合、関数は2つのパラメータを受信します.属性名と属性値です.
var book = {
                        title: "Professional JavaScript",
                        authors: [
                            "Nicholas C. Zakas"
                        ],
                        edition: 3,
                        year: 2011
                   };

        var jsonText = JSON.stringify(book, function(key, value){
            switch(key){
                case "authors":
                    return value.join(",")
                 
                case "year":
                    return 5000;
                    
                case "edition":
                    return undefined;
                    
                default:
                    return value;
            }
    ここで3つの注意が必要です.1.入力されたのは空の文字列で、値はbookオブジェクトです.2.default値を提供して、他の値を正常に表示します.3.editionでundefinedを返したら、この属性を削除します.(JSONにundefinedがありません)
2.文字列のインデント
    3番目のパラメータはインデントの空欄数を表します.
var book = {
                        title: "Professional JavaScript",
                        authors: [
                            "Nicholas C. Zakas"
                        ],
                        edition: 3,
                        year: 2011
                   };

        var jsonText = JSON.stringify(book, null, 4);
3.toJSON()方法
    オブジェクトにtoJSON方法を定義することができます.
var book = {
                       "title": "Professional JavaScript",
                        "authors": [
                            "Nicholas C. Zakas"
                        ],
                        edition: 3,
                        year: 2011,
                        toJSON: function(){
                            return this.title;
                        }
                   };

        var jsonText = JSON.stringify(book);
    JSON.strigifyの実行手順は以下の通りです.
1.toJSON()方法があり、かつ有効な値を得ることができる場合は、この方法を呼び出します.そうでなければ、対象自体に戻ります.2.第2のパラメータを提供したら、この関数フィルタを適用します.着信関数フィルタの値は、第1のステップの戻り値です.3.第2のステップの戻り値をそれぞれ順に並べます.4.第3のパラメータを提供したら、対応するフォーマットを行います.
3.解析オプション
    JSON.parseはまた別のパラメータを受信することができ、このパラメータは関数であり、この関数も2つのパラメータを受信します.1つのキーと1つの値、そしていずれも1つの値を返す必要があります.
    還元関数がundefinedに戻ると、結果から該当するキーを削除することを表します.他の値を返すと、その値を結果に挿入します.
var book = {
                       "title": "Professional JavaScript",
                        "authors": [
                            "Nicholas C. Zakas"
                        ],
                        edition: 3,
                        year: 2011,
                        releaseDate: new Date(2011, 11, 1)
                   };

        var jsonText = JSON.stringify(book);
        alert(jsonText);
        
        var bookCopy = JSON.parse(jsonText, function(key, value){
            if (key == "releaseDate"){
                return undefined;
            } else {
                return value;
            }
        });