Subversion-Projekte lars-tiefland.prado

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<com:TContent ID="Main">
2
 
3
<h1>Penanganan Kesalahan dan Pencatatan</h1>
4
 
5
<p>
6
Jika kita mencoba mengakses URL <tt>http://hostname/blog/index.php?page=EditPost&id=100</tt>, kita akan melihat halaman kesalahan berikut karena tulisan dengan ID 100 belum ada dalam sistem blog kita. Kita ingin mengkustomisasi halaman kesalahan ini agar ia terlihat lebih konsisten dengan tata letak halaman blog lain. Kita juga ingin mencatat jenis kesalahan ini untuk mempelajari kebiasaan pengguna. Dalam bagian ini, kita akan melaksanakan dua tugas ini.
7
</p>
8
 
9
<img src="<%~ output2.gif %>" class="output" />
10
 
11
<com:InfoBox>
12
Tugas penting dalam aplikasi Web adalah <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Error">penanganan kesalahan</a> yang sering dikaitkan dengan <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Logging">pencatatan</a>. Ada dua jenis kesalahan yang bisa terjadi dalam aplikasi PRADO: yang disebabkan oleh para pengembang dan yang disebabkan oleh pengguna-akhir. Pembentuk harus dipecahkan sebelum aplikasi dijadikan tahap produksi, sementara yang terakhir biasanya di dalam lingkup desain awal dan harus ditangani dengan baik (misalnya mencatat kesalahan dan menampilkan halaman khusus yang menginstruksikan pengguna-akhir apa yang harus dilakukan selanjutnya). PRADO mengimplementasikan kerangka kerja yang fleksibel serta bertenaga untuk menangani kesalahan dan pencatatan.
13
</com:InfoBox>
14
 
15
 
16
<h2>Mengkustomisasi Penanganan Kesalahan</h2>
17
 
18
<p>
19
PRADO secara implisit mengambil modul <tt>TErrorHandler</tt> untuk menangani kesalahan. Kita ingin mengkustomisasi modul ini agar sistem blog kita dapat menampilkan halaman terkustomisasi untuk kesalahan yang disebabkan oleh pengguna-akhir. Selanjutnya memodifikasi konfigurasi aplikasi seperti berikut:
20
</p>
21
 
22
<com:TTextHighlighter CssClass="source" Language="xml">
23
......
24
<modules>
25
    ......
26
    <module class="Application.BlogErrorHandler" />
27
    ......
28
</modules>
29
......
30
</com:TTextHighlighter>
31
 
32
<p>
33
Kelas <tt>BlogErrorHandler</tt> seperti ditetapkan di atas adalah modul pengendali kesalahan baru as yang akan dibuat berikutnya. Ia memperluas dan mengganti modul standar <tt>TErrorHandler</tt>.
34
</p>
35
 
36
<p>
37
Kita membuat sebuah file bernama <tt>protected/BlogErrorHandler.php</tt> seperti berikut. Kelas <tt>BlogErrorHandler</tt> mengganti dua metode <tt>TErrorHandler</tt>:
38
</p>
39
<ul>
40
  <li><tt>getErrorTemplate()</tt> - metode ini mengembalikan string template yang dipakai untuk menampilkan kesalahan pengguna tertentu.</li>
41
  <li><tt>handleExternalError()</tt> - metode ini dipanggil saat kesalahan pengguna terjadi dan menampilkan kesalahannya.</li>
42
</ul>
43
<com:TTextHighlighter CssClass="source" Language="php">
44
Prado::using('System.Exceptions.TErrorHandler');
45
Prado::using('Application.BlogException');
46
 
47
class BlogErrorHandler extends TErrorHandler
48
{
49
	/**
50
	 * Mengambil template yang dipakai untuk menampilkan eksepsi eksternal.
51
	 * Metode ini mengganti implementasi leluhurnya.
52
	 */
53
	protected function getErrorTemplate($statusCode,$exception)
54
	{
55
		// gunakan template sendiri untuk BlogException
56
		if($exception instanceof BlogException)
57
		{
58
			// ddapatkan path file template kesalahan: protected/error.html
59
			$templateFile=Prado::getPathOfNamespace('Application.error','.html');
60
			return file_get_contents($templateFile);
61
		}
62
		else // sebaliknya gunakan template yang didefinisikan oleh PRADO
63
			return parent::getErrorTemplate($statusCode,$exception);
64
	}
65
 
66
	/**
67
	 * Menangani kesalahan eksternal yang disebabkan oleh pengguna-akhir.
68
	 * Metode ini mengganti implementasi leluhurnya.
69
	 * Ini dipanggil oleh PRADO saat eksepsi eksternal dikeluarkan.
70
	 */
71
	protected function handleExternalError($statusCode,$exception)
72
	{
73
		// catat kesalahan (hanya untuk BlogException)
74
		if($exception instanceof BlogException)
75
			Prado::log($exception->getErrorMessage(),TLogger::ERROR,'BlogApplication');
76
		// panggil implementasi leluhur untuk menampilkan kesalahan
77
		parent::handleExternalError($statusCode,$exception);
78
	}
79
}
80
</com:TTextHighlighter>
81
 
82
<p>
83
Dalam kode di atas, kita menetapkan bahwa saat <tt>BlogException</tt> dikeluarkan, kita menggunakan template baru <tt>protected/error.html</tt> untuk menampilkan kesalahan. Oleh karena itu, kita perlu membuat kelas <tt>BlogException</tt> dan mengganti semua <tt>THttpException</tt> yang ada dalam kode kita (seperti misalnya <a href="?page=Day3.CreateEditUser">EditUser</a> dan halaman <a href="?page=Day4.CreateReadPost">ReadPost</a>). Kita juga perlu membuat template kesalahan <tt>protected/error.html</tt>. Kelas <tt>BlogException</tt> memperluas <tt>THttpException</tt> dan kosong. File kelas disimpan sebagai <tt>protected/BlogException.php</tt>.
84
 
85
</p>
86
 
87
<com:TTextHighlighter CssClass="source" Language="php">
88
class BlogException extends THttpException
89
{
90
}
91
</com:TTextHighlighter>
92
 
93
<p>
94
Di bawah ini konten dalam template kesalahan kita <tt>protected/error.html</tt>. Catatan, template bukan template PRADO karena ia hanya mengenal jumlah token yang sangat terbatas, seperti <tt>%%ErrorMessage%%</tt>, <tt>%%ServerAdmin%%</tt>.
95
</p>
96
 
97
<com:TTextHighlighter CssClass="source" Language="xml">
98
<html>
99
<head>
100
<title>%%ErrorMessage%%</title>
101
</head>
102
<body>
103
<div id="page">
104
<div id="header">
105
<h1>My PRADO Blog</h1>
106
</div>
107
<div id="main">
108
<p style="color:red">%%ErrorMessage%%</p>
109
<p>
110
The above error happened when the server was processing your request.
111
</p>
112
<p>
113
If you think this is a server error, please contact the <a href="mailto:%%ServerAdmin%%">webmaster</a>.
114
</p>
115
</div>
116
</body>
117
</html>
118
</com:TTextHighlighter>
119
 
120
 
121
<h2>Mencatat Kesalahan</h2>
122
 
123
<p>
124
Dalam metode <tt>handleExternalError()</tt> pada  <tt>BlogErrorHandler</tt>, kita memanggil <tt>Prado::log()</tt> untuk mencatat kesalahan jika tipenya adalah <tt>BlogException</tt>. Kesalahan dicatat dalam memori. Untuk menyimpan catatan ke dalam medium permanen seperti file atau database, kita perlu menghidupkan rute pencatatan kesalahan yang sesuai. Ini dikerjakan dalam konfigurasi aplikasi seperti berikut:
125
</p>
126
 
127
<com:TTextHighlighter CssClass="source" Language="xml">
128
......
129
<modules>
130
    ......
131
    <module id="log" class="System.Util.TLogRouter">
132
        <route class="TFileLogRoute" Categories="BlogApplication" />
133
    </module>
134
    ......
135
</modules>
136
......
137
</com:TTextHighlighter>
138
 
139
<p>
140
Dalam konfigurasi di atas, kita menambahkan rute log yang menyimpan catatan ke dalam sebuah file. Kita juga menetapkan filter kategori sebagai <tt>BlogApplication</tt> agar hanya mencatat pesan pada kategori yang dipilih yang disimpan. Ini membantu mengurangi ukuran file catatan dan juga meningkatkan pembacaannya.
141
</p>
142
 
143
<h2>Pengujian</h2>
144
<p>
145
Untuk melihat bagaimana sistem blog kita merespon permintaan tidak benar dari pengguna, kita menguji URL <tt>http://hostname/blog/index.php?page=posts.ReadPost&id=100</tt>. Kita akan melihat halaman kesalahan berikut yang berbeda dari apa yang telah kita lihat sebelumnya.
146
</p>
147
 
148
<img src="<%~ output3.gif %>" class="output" />
149
 
150
<p>
151
Jika kita mencari di bawah direktori <tt>protected/runtime</tt>, kita akan menemukan file bernama <tt>prado.log</tt>. Ini adalah file log yang baru dikonfigurasi untuk menyimpan pesan kesalahan. File dapat berisi konten seperti berikut,
152
</p>
153
 
154
<com:TTextHighlighter CssClass="source" Language="prado">
155
Jun 28 22:15:27 [Error] [BlogApplication] Unable to find the specified post.
156
Jun 29 08:42:57 [Error] [BlogApplication] Unable to find the specified post.
157
</com:TTextHighlighter>
158
 
159
</com:TContent>