คำถามติดแท็ก exceptions

ข้อยกเว้นคือการเกิดขึ้นในกระบวนการแอปพลิเคชันที่ต้องการเบี่ยงเบนจากโฟลว์ปกติของโปรแกรม

2
ข้อยกเว้นสำหรับการควบคุมการไหลที่ดีที่สุดใน Python หรือไม่?
ฉันกำลังอ่าน "Learning Python" และเจอสิ่งต่อไปนี้: ข้อยกเว้นที่ผู้ใช้กำหนดยังสามารถส่งสัญญาณเงื่อนไขที่ไม่ใช่ผู้ใช้ ตัวอย่างเช่นรูทีนการค้นหาสามารถเขียนโค้ดเพื่อเพิ่มข้อยกเว้นเมื่อพบการจับคู่แทนที่จะส่งกลับค่าสถานะสถานะเพื่อให้ผู้โทรตีความ ในต่อไปนี้ตัวจัดการข้อยกเว้นลอง / ยกเว้น / อื่นทำงานของตัวทดสอบ if / else return-value: class Found(Exception): pass def searcher(): if ...success...: raise Found() # Raise exceptions instead of returning flags else: return เนื่องจาก Python นั้นถูกพิมพ์แบบไดนามิกและ polymorphic ไปที่แกนกลาง, ข้อยกเว้น, แทนที่จะเป็น Sentinel return values ​​นั้นเป็นวิธีที่นิยมใช้ในการส่งสัญญาณเงื่อนไขดังกล่าว ฉันได้เห็นสิ่งต่าง ๆ ที่กล่าวถึงหลายครั้งในฟอรัมต่าง ๆ และการอ้างอิงถึง Python …

4
ลองใช้ catch-blocks กันดีไหม?
ฉันมักจะพบว่าตัวเองต่อสู้กับเรื่องนี้ ... พยายามหาสมดุลระหว่างลอง / จับและรหัสไม่เป็นระเบียบลามกของแท็บวงเล็บและข้อยกเว้นถูกโยนกลับกองโทรเช่นมันฝรั่งร้อน ตัวอย่างเช่นฉันมีแอพที่ฉันกำลังพัฒนาอยู่ตอนนี้ซึ่งใช้ SQLite ฉันมีอินเทอร์เฟซฐานข้อมูลที่เป็นนามธรรมการเรียกใช้ SQLite และแบบจำลองที่ยอมรับสิ่งต่าง ๆ ที่จะเข้า / ออกจากฐานข้อมูล ... ดังนั้นหาก / เมื่อเกิดข้อยกเว้น SQLite ขึ้นมามันจะต้องถูกโยนขึ้นสู่รุ่น (ซึ่งเรียกว่า ) ใครจะต้องส่งมันให้ใครก็ตามที่เรียกว่า AddRecord / DeleteRecord / อะไรก็ตาม ... ฉันเป็นแฟนตัวยงของข้อยกเว้นซึ่งตรงกันข้ามกับการส่งคืนรหัสข้อผิดพลาดเนื่องจากรหัสข้อผิดพลาดสามารถถูกละเว้นลืม ฯลฯ ได้ในขณะที่การจัดการข้อยกเว้นเป็นหลัก (ได้รับฉันสามารถจับและย้ายได้ทันที ... ) ฉัน บางอย่างจะต้องมีวิธีที่ดีกว่าสิ่งที่ฉันเกิดขึ้นตอนนี้ แก้ไข: ฉันควรจะใช้ถ้อยคำนี้แตกต่างกันเล็กน้อย ฉันเข้าใจที่จะโยนเป็นประเภทที่แตกต่างกันและเช่นนั้นฉันพูดได้ไม่ดีและนั่นเป็นความผิดของฉันเอง คำถามของฉันคือ ... จะรักษาความสะอาดโค้ดเมื่อทำเช่นนั้นได้อย่างไร มันเริ่มรู้สึกเกะกะอย่างมากกับฉันหลังจากนั้นไม่นาน

7
การโยนข้อยกเว้นจากแบบฟอร์มคุณสมบัติที่ไม่ดีหรือไม่?
ฉันมักจะคิดว่าคุณสมบัติ (เช่นการดำเนินงาน set / get ของพวกเขา) ควรรวดเร็ว / ทันทีและปราศจากความล้มเหลว คุณไม่จำเป็นต้องลอง / รับรอบหรือการตั้งค่าคุณสมบัติ แต่ฉันกำลังมองหาวิธีที่จะใช้การรักษาความปลอดภัยตามบทบาทกับคุณสมบัติของวัตถุบางอย่าง ตัวอย่างเช่นคุณสมบัติ Employee.Salary วิธีแก้ปัญหาบางอย่างที่ฉันได้ลองใช้โดยที่คนอื่นพยายาม (โดยเฉพาะอย่างยิ่งหนึ่งคือตัวอย่าง AOP ที่นี่ ) เกี่ยวข้องกับการโยนข้อยกเว้นถ้า accessor ไม่มีสิทธิ์ที่ถูกต้อง - แต่สิ่งนี้ขัดกับกฎส่วนบุคคลที่ฉันมี เป็นเวลานานแล้ว ดังนั้นฉันถาม: ฉันผิด สิ่งต่าง ๆ มีการเปลี่ยนแปลงหรือไม่ เป็นที่ยอมรับกันหรือไม่ว่าคุณสมบัติควรจะสามารถโยนข้อยกเว้นได้หรือไม่
15 .net  exceptions 

1
มันเป็นเรื่องปกติไหมที่จะใช้ตัวสร้างปริยาย
ถามเฉพาะเกี่ยวกับตัวสร้างเริ่มต้น ระบุว่าตัวสร้างเริ่มต้นข้อมูลทั้งหมดสำหรับวัตถุถ้าฉันสร้างคลาสที่ไม่สามารถใช้โดยไม่ต้องเริ่มต้นที่เหมาะสมมันไม่ใช่กรณีที่นวกรรมิกเริ่มต้นไม่มีประโยชน์หรือไม่ พิจารณา: // A class for handling lines in a CSV file class CSV_Entry { private: unsigned num_entries; std::string string_version; std::vector<std::string> vector_version; ...etc public: CSV_Entry(); CSV_Entry(const std::string& src_line); // returns a vector copy of the original entry std::vector<std::string> get_vector_snapshot(); } int main( void ) { ...etc CSV_Entry example = …

8
ใน Java สิ่งใดบ้างที่มีการตรวจสอบข้อยกเว้นที่ดีสำหรับ [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ข้อยกเว้นที่ตรวจสอบของ Java ได้รับการกดที่ไม่ดีในช่วงหลายปีที่ผ่านมา สัญญาณบอกคือมันเป็นภาษาเดียวในโลกที่มี (ไม่ใช่ภาษา JVM อื่น ๆ เช่น Groovy และ Scala) ไลบรารี Java ที่มีชื่อเสียงเช่น Spring และ Hibernate ก็ไม่ควรใช้ ฉันพบการใช้งานส่วนตัวสำหรับพวกเขา ( ในตรรกะทางธุรกิจระหว่างเลเยอร์) แต่อย่างอื่นฉันก็ค่อนข้างยกเว้นการตรวจสอบการต่อต้าน มีการใช้งานอื่นที่ฉันไม่เข้าใจหรือไม่?

3
จะจำลองเหตุการณ์ที่ทำให้เกิดข้อยกเว้นเพื่อทดสอบบล็อกลอง / จับได้อย่างไร
ฉันเข้าใจวิธีการทำงานของข้อยกเว้นและวิธีการจับและจัดการกับมันใน C # แต่ฉันจะจำลองเหตุการณ์ที่อาจทำให้เกิดข้อยกเว้นเพื่อให้แน่ใจว่าถูกจับได้อย่างถูกต้องหรือไม่ ตัวอย่างเช่นเป็นไปได้หรือไม่ที่จะเรียกใช้แอปพลิเคชันในรูปแบบของเตียงทดสอบที่สามารถจำลองปัญหาเครือข่ายปัญหาฐานข้อมูลและอื่น ๆ ได้หรือไม่? ข้อยกเว้นโดยธรรมชาติของพวกเขาดูเหมือนจะยากที่จะทำซ้ำจึงทำให้ยากที่จะมั่นใจได้ว่ารหัสของคุณสามารถรับมือกับพวกเขาได้ แม้ว่าฉันส่วนใหญ่จะพัฒนาโดยใช้ C # /. NET / Visual Studio คำตอบหรือแหล่งข้อมูลที่เกี่ยวข้องกับภาษาอื่นอาจมีประโยชน์
14 c#  testing  exceptions 

4
ฉันจะเขียนแบบทดสอบเพื่อหาวิธีบริสุทธิ์ที่ไม่ส่งคืนสิ่งใดได้อย่างไร
ฉันมีวิชาเรียนมากมายที่จัดการกับการตรวจสอบความถูกต้องของค่า ตัวอย่างเช่นRangeValidatorคลาสจะตรวจสอบว่าค่าอยู่ในช่วงที่ระบุหรือไม่ คลาสตัวตรวจสอบความถูกต้องมีสองวิธี: is_valid(value)ซึ่งส่งคืนTrueหรือFalseขึ้นอยู่กับค่าและensure_valid(value)ตรวจสอบค่าที่ระบุและไม่ทำอะไรเลยถ้าค่านั้นถูกต้องหรือส่งข้อยกเว้นเฉพาะถ้าค่าไม่ตรงกับกฎที่กำหนดไว้ล่วงหน้า ขณะนี้มีการทดสอบสองหน่วยที่เกี่ยวข้องกับวิธีนี้: สิ่งที่ผ่านค่าที่ไม่ถูกต้องและทำให้แน่ใจว่ามีข้อผิดพลาดเกิดขึ้น def test_outside_range(self): with self.assertRaises(demo.ValidationException): demo.RangeValidator(0, 100).ensure_valid(-5) สิ่งที่ผ่านค่าที่ถูกต้อง def test_in_range(self): demo.RangeValidator(0, 100).ensure_valid(25) แม้ว่าการทดสอบครั้งที่สองจะทำงาน - ล้มเหลวหากมีการโยนข้อยกเว้นและประสบความสำเร็จหากensure_validไม่ได้โยนอะไรเลย - ความจริงที่ว่าไม่มีสิ่งใดassertอยู่ข้างในดูแปลก คนที่อ่านรหัสดังกล่าวจะถามตัวเองทันทีว่าทำไมมีการทดสอบซึ่งดูเหมือนว่าไม่ได้ทำอะไรเลย นี่เป็นแนวปฏิบัติในปัจจุบันเมื่อทดสอบวิธีที่ไม่ส่งคืนค่าและไม่มีผลข้างเคียงหรือไม่ หรือฉันควรจะเขียนการทดสอบในวิธีที่ต่างออกไป? หรือเพียงแค่ใส่ความคิดเห็นอธิบายสิ่งที่ฉันทำ

4
มีข้อยกเว้นในการจัดการกับปัญหาการตัดขวางหรือไม่?
ฉันไม่เห็นความแตกต่างระหว่างข้อกังวลของการจัดการข้อยกเว้นและการเข้าสู่ระบบที่ทั้งคู่เป็นข้อกังวลตัดขวาง คุณคิดอย่างไร? ไม่ควรจัดการแยกต่างหากด้วยตัวเองแทนที่จะสอดแทรกด้วยตรรกะหลักที่วิธีการใช้งานอยู่? แก้ไข : สิ่งที่ฉันพยายามจะพูดก็คือในความคิดของฉันการใช้วิธีการควรมีตรรกะสำหรับเส้นทางที่ประสบความสำเร็จของการดำเนินการและข้อยกเว้นควรได้รับการจัดการที่อื่น นี่ไม่ใช่ข้อยกเว้นเกี่ยวกับการตรวจสอบ / ไม่ได้ตรวจสอบ ตัวอย่างเช่นภาษาอาจจัดการกับข้อยกเว้นในวิธีการตรวจสอบอย่างสมบูรณ์โดยใช้โครงสร้างดังนี้: class FileReader { public String readFile(String path) { // implement the reading logic, avoid exception handling } } handler FileReader { handle String readFile(String path) { when (IOException joe) { // somehow access the FileInputStram and close it } } …

6
วิธีที่ดีที่สุดในการจัดการการบันทึกข้อผิดพลาดสำหรับข้อยกเว้นคืออะไร
บทนำ หากมีข้อผิดพลาดเกิดขึ้นในเว็บไซต์หรือระบบแน่นอนว่ามีประโยชน์ในการบันทึกและแสดงข้อความสุภาพพร้อมรหัสอ้างอิงสำหรับข้อผิดพลาด และถ้าคุณมีระบบจำนวนมากคุณไม่ต้องการให้ข้อมูลนี้กระจายไปทั่ว - มันเป็นการดีที่จะมีศูนย์กลางรวมอยู่ที่เดียว ในระดับที่ง่ายที่สุดสิ่งที่จำเป็นทั้งหมดคือรหัสที่เพิ่มขึ้นและการดัมพ์แบบต่อเนื่องของรายละเอียดข้อผิดพลาด (และอาจเป็น "ศูนย์รวม" ที่เป็นกล่องจดหมายของอีเมล) ที่ปลายอีกด้านของสเปกตรัมอาจเป็นฐานข้อมูลปกติที่ช่วยให้คุณกดปุ่มและดูกราฟข้อผิดพลาดต่อวันหรือระบุว่าข้อผิดพลาดประเภทใดที่พบบ่อยที่สุดในระบบ X คือเซิร์ฟเวอร์ A มีฐานข้อมูลมากกว่าหรือไม่ ข้อผิดพลาดการเชื่อมต่อกว่าเซิร์ฟเวอร์ B และอื่น ๆ สิ่งที่ฉันอ้างถึงที่นี่คือการบันทึกข้อผิดพลาด / ข้อยกเว้นระดับรหัสโดยระบบรีโมต - ไม่ใช่การติดตามปัญหา "ตามมนุษย์" เช่นเสร็จสิ้นกับ Jira, Trac เป็นต้น คำถาม ฉันกำลังมองหาแนวคิดจากนักพัฒนาที่ใช้ระบบประเภทนี้โดยเฉพาะเกี่ยวกับ: ฟีเจอร์สำคัญที่คุณขาดไม่ได้คืออะไร? อะไรคือสิ่งที่ดีที่มีคุณสมบัติที่ช่วยให้คุณประหยัดเวลาได้จริง? คุณลักษณะใดบ้างที่อาจเป็นความคิดที่ดี แต่จริงๆแล้วมันไม่มีประโยชน์อะไรเลย ตัวอย่างเช่นฉันว่าฟังก์ชัน "แสดงรายการที่ซ้ำกัน" ซึ่งระบุข้อผิดพลาดหลายครั้ง (โดยไม่ต้องกังวลเกี่ยวกับรายละเอียด 'ไม่สำคัญ' ที่อาจแตกต่างกัน) เป็นสิ่งสำคัญ ปุ่มสำหรับ "สร้างปัญหาใน [Jira / etc] สำหรับข้อผิดพลาดนี้" ฟังดูเหมือนเป็นการประหยัดเวลาได้ดี สิ่งที่ฉันตามมาคือประสบการณ์การใช้งานจริงจากผู้คนที่ใช้ระบบดังกล่าวโดยเฉพาะการสำรองข้อมูลด้วยเหตุใดคุณลักษณะจึงยอดเยี่ยม / …

5
เมื่อใดจะเริ่มเขียนการจัดการข้อยกเว้นการบันทึก
คุณจะเริ่มเขียนโค้ดจัดการข้อยกเว้นเมื่อใด คุณเริ่มเขียนคำสั่งการบันทึกเมื่อใด เพื่อจุดประสงค์ในการอธิบายคำถามนี้ให้เราสมมติว่าเราอยู่บนแพลตฟอร์ม. NET ที่มีการบันทึก log4net แต่คุณสามารถตอบได้อย่างอิสระ การแก้ไข: โครงการ Windows Forms โครงการ: UI, BusinessRules, DataHandlers ดังนั้นคุณจะไปเกี่ยวกับการเขียน DataHandlers ของคุณซึ่งการจัดการข้อมูลของคุณเช่นสร้างอ่านอัปเดตลบก่อน จากนั้นติดตามกฎธุรกิจของคุณ จากนั้น UI ของคุณหรือการเปลี่ยนแปลงอื่น ๆ ข้างต้น ทดสอบแอปพลิเคชันของคุณสำหรับการใช้งาน และจากนั้นก็เริ่มต้นการเขียนข้อยกเว้นของการจัดการรหัสและในที่สุดรหัสเข้าสู่ระบบของคุณหรือไม่ เวลาที่เหมาะสมในการเริ่มเขียนรหัสการจัดการข้อยกเว้นของคุณคือเมื่อใด PS: ในClean Codeของหนังสือพวกเขาบอกว่าเขียนบล็อกtry-catch-สุดท้ายของคุณก่อน นั่นทำให้ฉันถามคำถามนี้

5
ควรให้บริการมีข้อยกเว้นหรือส่งคืนเมื่อไม่มีรายการที่ระบุไว้สำหรับการลบ
ฉันมีโค้ดบางส่วนที่สามารถแสดงเป็น: public class ItemService { public void DeleteItems(IEnumerable<Item> items) { // Save us from possible NullReferenceException below. if(items == null) return; foreach(var item in items) { // For the purpose of this example, lets say I have to iterate over them. // Go to database and delete them. } } …

5
อะไรคือความแตกต่างทางแนวคิดระหว่างสุดท้ายและผู้ทำลายล้าง
ก่อนอื่นฉันตระหนักดีว่าเหตุใดจึงไม่มีการสร้าง 'ที่สุด' ใน C ++ แต่การอภิปรายความคิดเห็นที่เพิ่มขึ้นอย่างต่อเนื่องในคำถามอื่นดูเหมือนจะรับประกันคำถามแยกต่างหาก นอกเหนือจากปัญหาที่finallyใน C # และ Java สามารถมีอยู่ได้เพียงครั้งเดียว (== 1) ต่อขอบเขตและขอบเขตเดียวสามารถมี destructors C ++ หลายตัว (== n) ฉันคิดว่ามันเป็นสิ่งเดียวกัน (ด้วยความแตกต่างทางเทคนิค) อย่างไรก็ตามผู้ใช้คนอื่นแย้ง : ... ฉันพยายามที่จะบอกว่า dtor เป็นเครื่องมือสำหรับ (sematics ที่วางจำหน่าย) และในที่สุดก็เป็นเครื่องมือสำหรับ (Commit semantics) หากคุณไม่เห็นสาเหตุ: ลองคิดดูว่าทำไมการโยนข้อยกเว้นทับซ้อนทับกันในที่สุดก็เป็นเรื่องถูกกฎหมายและทำไมสิ่งเดียวกันถึงไม่ได้สำหรับผู้ทำลายล้าง (ในบางแง่มันเป็นข้อมูลเทียบกับสิ่งควบคุม Destructors สำหรับการปล่อยข้อมูลในที่สุดก็เพื่อปล่อยการควบคุมพวกมันต่างกันโชคไม่ดีที่ C ++ เชื่อมโยงพวกเขาเข้าด้วยกัน) มีคนล้างข้อมูลนี้ได้ไหม

2
ฉันจะจัดการกับความล้มเหลวของคนตัดไม้ได้อย่างไร
ในหลายแอปพลิเคชันของ บริษัท เราใช้ตัวบันทึกที่กำหนดเอง มันค่อนข้างแข็งแกร่งแม้ว่าเราอาจแทนที่ด้วยอะไรบางอย่างเช่น NLog ในอนาคต หนึ่งในหน้าที่ของคนตัดไม้คือการบันทึกข้อยกเว้นที่พบในแอปพลิเคชัน สิ่งหนึ่งที่ฉันกังวลอยู่เสมอคือการจัดการข้อยกเว้นภายในตัวบันทึกช่วยให้เกิดความล้มเหลวเงียบ นั่นคือถ้าบันทึกไม่ได้ถูกเขียนสำหรับข้อยกเว้นที่กำหนด (เนื่องจากข้อผิดพลาดในตัวบันทึก) ฉันจะจัดการกับมันอย่างไรและ (อย่างใด) บันทึกข้อยกเว้นในตัวบันทึกเอง ? สมมติว่าฟังก์ชัน WriteLog ส่งข้อยกเว้น ฉันควรลองเรียกใช้ฟังก์ชันบางครั้งหรือจนกว่าจะมีข้อผิดพลาดเกิดขึ้น? ฉันควรลองเขียนข้อยกเว้นที่โยนด้วยตัวบันทึก (ซึ่งน่าจะส่งผลให้เกิดข้อยกเว้นลงไปหมด ... ) ฉันโชคดีที่ไม่พบสถานการณ์นี้ยกเว้นตอนที่เราใช้งานตัวบันทึกที่กำหนดเองเป็นครั้งแรก ในทางกลับกันฉันไม่มีทางรู้ได้เลยว่าคนตัดไม้ล้มเหลวในการบันทึกข้อยกเว้นแอปพลิเคชัน (เนื่องจากข้อยกเว้นของตัวเอง) ฉันได้ลองค้นหาทางออนไลน์และในเว็บไซต์ SE บางแห่ง แต่มันก็ยังไม่เกิดผลดีนักเนื่องจากการโพสต์ทั้งหมดมีข้อผิดพลาดในตัวบันทึก (แต่ไม่ใช่ข้อยกเว้นที่เป็นไปได้และวิธีการบันทึก) หรือข้อยกเว้นภายนอกตัวบันทึก

1
ข้อยกเว้นการปฏิบัติหรือคำแนะนำที่ดีที่สุด [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน5 ปีที่ผ่านมา ฉันคิดว่าปัญหาหลักสองประการของโปรแกรมของฉันคือโครงสร้างรหัส / องค์กรและการจัดการข้อผิดพลาดของฉัน ฉันกำลังอ่าน Code Complete 2 แต่ฉันต้องการอ่านเพื่อทำงานกับปัญหาที่อาจเกิดขึ้น ตัวอย่างเช่นบนเว็บไซต์หากบางสิ่งสามารถเกิดขึ้นได้เฉพาะเมื่อผู้ใช้ tampers กับข้อมูลผ่านทางจาวาสคริปต์คุณเขียนเพื่อที่? นอกจากนี้เมื่อใดที่คุณไม่พบข้อผิดพลาด? เมื่อคุณเขียนคลาสที่คาดว่าสตริงและ int เป็นอินพุตและพวกเขาไม่ใช่สตริงและ int คุณตรวจสอบสิ่งนั้นหรือไม่หรือคุณปล่อยให้มันลอยไปจนถึงวิธีการโทรที่ผ่านพารามิเตอร์ที่ไม่ถูกต้องหรือไม่ ฉันรู้ว่านี่เป็นหัวข้อกว้าง ๆ ที่ไม่สามารถตอบได้ด้วยคำตอบเดียวที่นี่ดังนั้นสิ่งที่ฉันกำลังมองหาคือหนังสือหรือแหล่งข้อมูลที่ได้รับการยอมรับโดยทั่วไปว่าเป็นการสอนการจัดการข้อยกเว้นที่เหมาะสม

4
การสร้างใหม่เป็นข้อยกเว้นที่ทำให้สิ่งที่เป็นนามธรรมรั่วไหลหรือไม่?
ฉันมีวิธีการอินเทอร์เฟซที่ระบุไว้ในเอกสารมันจะโยนประเภทของข้อยกเว้นเฉพาะ การใช้วิธีการนั้นใช้สิ่งที่ส่งข้อยกเว้น มีการตรวจสอบข้อยกเว้นภายในและข้อยกเว้นที่ประกาศโดยสัญญาส่วนต่อประสาน นี่คือตัวอย่างรหัสเล็กน้อยที่จะอธิบายได้ดีขึ้น มันเขียนใน PHP แต่ค่อนข้างง่ายที่จะติดตาม // in the interface /** * @return This method returns a doohickey to use when you need to foo * @throws DoohickeyDisasterException */ public function getThatDoohickey(); // in the implementation public function getThatDoohickey() { try { $SomethingInTheClass->doSomethingThatThrowsAnException(); } catch (Exception $Exc) { throw …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.